今天在敲程序时候,遇到了一些小问题,于是决定利用博客来记录下来,这也是我写的第一篇CSDN的博客,希望以后能坚持下去,记录自己的学习和生活中的点滴。
指针和多级指针
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 1000;
int *p = &i;//p中的内容是i的地址
int **q = &p;//q中的内容是p的地址
int ***r = &q;//r中的内容是q的地址
printf("%d\n",***r);//输出的结果是10;
return 0;
}
要点:
1.q是int 类型,p是 int 类型,r则是int * *类型;
2.指针和多级指针的关系
3. * * * r = * * q = * p = i,* p表示以p的内容为地址的变量,由图片我们可以看出,p中存放的是 int 变量i的地址,所以* p就等价于i,同理* q和** r的的含义是一样的
指针和一维数组
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[3] = {1,2,3};//a是a[3]的首地址 == &a[0];
int i;
int *p = a;//等价于int *p = &a[0];
//*p = a[0]的含义是将a[0]的值赋给 *p;
for(i = 0;i < 3;i++)
printf("%d",a[i]);//等价于printf("%d",*(p+i));
return 0;
}
要点:
1.a是数组的首地址,等同于&a[0];
2.printf(“%d”,a[i]);等价于printf(“%d”,* (p+i));因为数组是连续的 ,* (p+i)即指针p指向数组的第几个元素
指针和二维数组
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a1[3];
int a2[3];
int a3[3];
int * p;
int p1[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
//p1指向int [3]的指针,此处的int [3]是指二维数组中每一行的元素
//p1和a1是相同类型的,属于int *类型 注*:a1是指数组首地址
int * p2[3] = {a1,a2,a3};
//p2是一个指向 int * 的指针,即ptr2的类型和&ptr是一样的,属于int **类型
}
要点:
1.二维数组在计算机中其实是特殊的一维数组
即a[0]这行上有1,3,5,7这四个元素;
2.* ((p+i)+j)等价于p[i] [j], (p+i)代表第i行元素,* (p+i)+j则是指这行元素上的第j个元素, 然后通过 * 运算符* (*(p+i)+j)数组p[][j]中的第i行j列元素,结合上图理解二维数组是特殊的一维数组即可;
总结及参考资料
1.理解指针和数组要从内存上着手
2.二维数组的地方比较绕,要好好理解
二维数组和指向指针的指针
C/C++中二维数组和指针关系的分析
二维数组的简介和使用