指针与数组

C语言指针,数组区分

刚学习c语言时对二级指针,指向一维数组的指针,数组,二维数组概念模糊不清,经过思考反复推敲验证后有了更加清晰的认识,分享给大家,希望能帮到刚学习的人

二级指针赋值

void main()
{
int **p;//二级指针,变量
int a = 3, *p1;
p1 = &a;
p = &p1;
char b[3] = “ab”;//字符数组,一级指针,常量
printf(“p=%p\n”, p);//输出(存放一级指针地址的内存)的地址
printf(“b=%p\n”, b);//输出数组地址,即b[0]地址
printf(“b[0]=%p\n”,b[0]);
printf(“b[1]=%p\n”, b[1]);
printf(“数组首地址=%p\n”, “array”);//输出字符串地址,字符串以数组形式保存,即数组首地址
printf(“****************\n”);
结果如下

二级指针与指针数组的关系

int **q;//二级指针,变量
int w = 1, e = 2, r = 3;
int *c[] = { &w, &e, &r };//指针数组,每个元素是一个指针,相当于常量二级指针
q = c;
printf(“q=%p\n”, q);//输出常量二级指针地址,与c等价
printf(“c=%p\n”, c);
printf(“*q=%p\n”, *q);//输出w的地址,相当于*c,c[0]
printf(“*c=%p\n”, *c);
printf(“c[0]=%p\n”, c[0]);
printf(“&w=%p\n”, &w);
printf(“c[0][0]=%p\n”, c[0][0]);//c[0][0]就是w,即数字1,输出数字1的地址,注意不是保存数字内存的地址
printf(“*c[0]=%p\n”, *c[0]);//同c[0][0]
printf(“*********************\n”);
详情如下

二维数组与指向一维数组指针的关系

int (*n)[3];//指向一维数组的指针,即指向长度为3的一维数组
int m[2][3] = {1,2,3,4,5,6};//二维数组,相当于指向一维数组指针常量
n = m;
printf(“n=%p\n”, n); //可以发现n,m,m[0],&m[0][0]数值上都是相同的,都是m[0][0]的地址,但是加减上并不相同,将m+1,意思是跳转整行,
printf(“m=%p\n”, m); //而m[0]+1意思是在第一行上跳转一列
printf(“m[0]=%p\n”, m[0]);
printf(“输出的值是m[1][0]->%d\n”, **(m + 1));
printf(“输出的值是m[0][1]->%d\n”, *((*m) + 1));
printf(“&m[0][0]=%p\n”, &m[0][0]);
printf(“m[0][0]=%p\n”, m[0][0]);
这里写图片描述

二维数组与二级指针区别

不能将二维数组赋值给二级指针,因为两者类型不同
int **k;
int d[2][3] = { 1, 2, 3, 4, 5, 6 };
k = d;会报错!
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值