C语言集训-王丽宁-第五次作业

161 阅读5分钟

课堂笔记

重点内容 1.明白指针背后所蕴含的计算机底层知识 2.熟练掌握指针的简单用法 3.能看懂各种指针操作 4.能够去粉质真的类型与指针指向类型两个概念

指针

指针的重要性

表示一些复杂的数据结构
快速的传递数据
使函数返回一个以上的值
能直接访问硬件
能够方便地处理字符串
是理解面向对象语言中引用的基础
总结:指针式C语言的灵魂

指针的定义

 地址
   内存单元的编号
   从零开始的非负整数
   范围:4G【0--4G-1】
 指针
 指针就是地址,地址就是指针
 针变量就是存放内存单元编号的变量
 指针变量是存放地址的变量
 指针和指针变量是两个不同的概念
 但是要注意,通常我们叙述时会把指针变量简称为指针,实际它们含义并不一样

指针的分类     基本类型指针

附注:
 *的含义
 1.乘法
 2.定义指针变量
    int * p;定义了一个名字叫p的变量,int * 表示p只能存放整型变量
 3.指针运算符
      该运算符放在已经定义好的指针变量的前面
      如果是一个已经定义好的指针变量
      则* p表示以p的内容为地址的变量
      如果通过被调函数修改主调函数普通变量的值
          1.实参必须为该普通变量的地址
          2.形参必须为指针变量
          3.在被调函数中通过
          * 形参名 = ......
          的方式就可以修改主调函数相关变量的

2.指针与数组         

    指针和一位数组
    一维数组名
        一维数组名是个指针常量
        它存放的是一维数组第一个元素的地址
        下标和指针的关系
        如果p是个指针变量,则p[i]永远等价于*(p+i)
        确定一个一维数组需要几个参数
        需要两个参数:
            数组第一个元素的地址
            数组的长度
    指针变量的运算
        指针变量不能相加,不能相乘,也不能相除
        如果两个指针变量指向的是同一块连续空间中的不同存在
        则这两个指针变量才可以相减

一个指针变量到底占几个字节

       预备知识:
           sizeof(数据类型)
             功能:返回值就是该数据所占的字节数
           sizeof:(变量名)
             功能:返回值就是该变量所占的字节数
       假设p指向char类型变量(1个字节)
       假设q指向int类型变变量(4个字节)
       假设r指向doubla类型变量(8个字节)
       p q r 本身所占的字节数
   指针和二维数组
   3.指针与函数
   
   4.多级指针
   

专题:

      动态内存分配【重点难点】
            传统数据缺点:
            1.数组长度必须事先制定,且只能是常数量,不能是变量
                    eg:
                    int a[5]// OK
                    int len = 5int a[len]//error
            2.传统形式定义的数组,该数据内存程序员无法手动释放
            在一个函数运行期间,系统为该函数中数组所分配的空间
            会一直存在,知道该函数运行完毕时,数组的空间才会被
            系统释放
            3.数组的长度一旦定义,其长度不能再改变
            数组长度不能在函数运行过程中扩张或缩小
            4.A函数定义的数组,在A函数运行期间可以被其他函数利用,
             但A函数运行完毕后,A函数中的数组将无法在其他函数使用
      为什么需要动态分配内存
      
      动态内存分配举例_动态数组的构造
  静态内存和动态内存的比较
     静态内存是系统自动分配的,由系统自动释放
     静态内存实在栈分配的
     动态内存是由程序员手动分配,手动释放
     动态内存是在堆分配

   

上课程序

基本类型指针\

include <stdio.h>
void swap_l(int i, int j)
{
   int t;
   t=i; i=j;j=t;
}
int main(void)
{
    int a=3,b=5;
    swap_l(a,b);
    printf ("a = %d, b = %d",a,b);
    
    return 0;      
}

image.png

include <stdio.h>
void swap_2(int *p, int *q)
{
   int t;
   t= *p;*p = *q;*q = t;
}
int main(void)
{
    int a=3,b=5;
    swap_2(&a,&b);
    printf ("a = %d, b = %d",a,b);
    
    return 0;      
}

image.png

检测实参和形参是否是一个变量

include <stdio.h>
void f (int i)
{
   i = 90;
}
int main (void)
{
   int i =6; 
   printf ("i = %d\n",i);
   f(i);
   printf("i = %d\n",i);
    return 0;      
}

image.png

include <stdio.h>
void f(int * pArr, int len)
{
   int i;
   for (i=0; i<len; ++i)
       printf("%d ", *(pArr+i));
   printf("\n");
}
int main(void)
{
   int a[5] = {1,2,3,4,5};
   int b[6] = {-1,-2,-3,4,5,-6};
   int c[100] = {1,99,22,33};
   f(a,5);
   f(b,6);
   f(c,100);
   return 0;
}

image.png

# include <stdio.h>
int f(int * p,int *q)
{
   *p = 1;
   *q = 2;
}
int main(void)
{
   int a = 3,b = 5;
   f(&a,&b);
   printf("%d %d\n",a,b);
   return 0;
}

image.png

数组

# include <stdio.h>
int main(void)
{
   int a[5];
   printf("%#X\n",&a[0]);
   printf("%#X\n",a);
   return 0;
}

image.png

确定一个一维数组需要几个参数

# include <stdio.h>
void f(int*pArr, int len)
{
   pArr[3] = 88;
}
int main(void)
{
   int a[6] = {1,2,3,4,5,6};
   printf("%d\n",a[3]);
   return 0;
}

image.png

指针变量的运算

# include <stdio.h>
int main(void)
{
   int i = 5;
   int j = 10;
   int *p = &i;
   int *q = &j;
   int a[5];
   p = &a[1];
   q = &a[4];
   printf("p和q所指向的单元相隔%d个单元");
   return 0;
}

image.png

一个指针变量到底占几个字节的问题

# include <stdio.h>
int main(void)
{
   char ch = 'A';
   int i = 99;
   double x = 66.6;
   char *p = &ch;
   int *q = &i;
   double *r = &x;
   printf("%d %d %d\n", sizeof(p), sizeof(q), sizeof(r));
   return 0;
}

image.png

malloc用法

# include <stdio.h>
# include <malloc.h>
void f(int *q)
{
   *q = 200;
   free(q);
}
int main(void)
{
   int *p = (int *)malloc(sizeof(int));
   *p = 10;
   printf("%d\n",*p);
   f(p);
   printf("%d\n",*p);
   return 0;
}

image.png

动态内存分配

# include <stdio.h>
# include <malloc.h>
int main(void)
{
   int i;
   int len;
   int *pArr;
   printf("请输入你要存放的元素的个数:");
   scanf("%d", &len);
   pArr = (int *)malloc(4 * len);
   for (i=0; i<len; ++i)
       scanf("%d", &pArr[i]);
   printf("一位数组的内容是:\n");
   for (i=0; i<len; ++i)
       printf("%d\n", pArr[i]);
   return 0;
}

image.png

多级指针

# include <stdio.h>
int main(void)
{
   int i = 10;
   int *p = &i;
   int **q = &p;
   int ***r = &q;
   printf("i = %d", ***r);
   return 0;
}

image.png

课后作业

10.12-1

8 8
4 4
0 0
2 2

10.12-2

4

10.12-3

一维数组的第一个元素的地址
++ref不知道指向什么

10.12-4

12 16
12 14

10.12-5

12 16
12 14