关于C语言指针的理解

C语言指针p,p,*p以及&p在内存中的关系

结构体(struct)的使用 - Tom不是猫的文章 - 知乎

我对指针的理解 - windliang的文章 - 知乎

C语言——指针与数组 - tetradecane的文章 - 知乎

数组指针和指针数组的区别 - yanlei的文章 - 知乎

  • 何为指针?
    指针,其本质就是一个存储内存地址的变量。

  • 指针运算符
    指针运算符有两个,取内容(*)和取地址(&)。

  • 什么是一级指针?二级指针?
    指针这种说法过于抽象,更好的理解方式是寻址,一级指针就是一次寻址,二级指针就是两次寻址。


    image.png
  • 一维数组和指针

二维数组和指针

  • 一级指针表示二维数组


    image.png
int a[2][3] = { { 1,2,3 },{ 4,5,6 } };
int *b = (int * )a;
cout << b[4] << endl; //5

int *b = a[0];
cout << b[4] << endl; //5

int *b = &a[0][0];
cout << b[4] << endl; //5
  • 二级指针表示二维数组


    image.png
思路:
将数组划分为两块,每一块的首地址由一个指针变量保存,需要两个指针变量;
再次申请一块内存空间,保存这两个指针变量,此内存空间的首地址由一个指针变量保存。

int a[2][3] = { { 1,2,3 },{ 4,5,6 } };
int m,n,i,j;
    m=2;n=3;
    int **p;
   
    p=(int**)malloc(sizeof(int*)*m);//P是指针的指针 ,p申请了一块内存空间去保存两个指针地址
    for(i=0;i<m;i++)
    {
      p[i]=(int*)malloc(sizeof(int)*n);//p[i]是指针,p[i]申请一块内存空间,去存放a[i][j]的值 
      //p[i]为指针 
      for(j=0;j<n;j++)
      p[i][j]=a[i][j];
    } 
    printf("%d\r\n",p[1][1]);  //结果为5
    printf("p的值%d\r\n",p); 
    printf("p[0]的地址%d\r\n",&p[0]); 
    printf("p[1]的地址%d\r\n",&p[1]); 
    
    return 0;
  • 数组指针表示二维数组


    image.png
思路:
将二维数组逻辑上划分为2个数组,定义一个数组指针b,b 是 int [3] 类型的指针,
即b保存了一个int [3]数组的首地址,所以*(b+1)表示移动到下一个数组的首地址,
*(*(b + 1) + 1)即为对应数组的下标处内容。

int a[2][3] = { { 1,2,3 },{ 4,5,6 } };
int (*b)[3] = a;  //b 是 int [3] 类型的指针
cout << a[1][1] << endl; //5
cout << b[1][1] << endl; //5
cout << *(*(a + 1) + 1) << endl; //5
cout << *(*(b + 1) + 1) << endl; //5,b+1表示一次性移动int [3]个地址
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容