深入了解指针(part 2)

1.数组名的理解

(1)当数组名单独出现的时候,一般情况下表示数组首元素的地址

(2)例外的情况:

                               1)当出现&arr时,表示的是取出的整个数组的地址

                               2)当出现sizeof(arr)时,表示的是整个数组的大小

                                如:

int a[10] = { 0 };
printf("%p\n", a);
printf("%p\n", &a);
printf("%p\n", a+1);
printf("%p\n", &a+1);
printf("%d\n", sizeof(a[0]));
printf("%d\n", sizeof(a));
return 0;

2.使用指针访问数组

例如:

int a[3] = { 1,2,3 };
int sz = sizeof(a)/sizeof(a[0]);
int* p = a;
for (int i = 0; i < sz; i++)
	printf("%d ", *(p + i));//还可以写作p[i]
return 0;

3.二级指针

如:

int a = 5;
int* p1 = &a;//把a的地址传给p1
int** p2 = &p1;//把p1的地址传给p2
printf("%d %d", *p1, **p2);
return 0;

结果:

解释:p1解引用后就是a的值,p2解引用后先是p1,再解引用就是a的值

4.指针数组

定义:本质上是数组,指的是存放指针的数字,具体可以类比整形数组,字符数组等等

如图:

每一个存放一个指针。

利用指针数组模拟二维数组

例如:

	int a1[3] = { 1,2,3 };
	int a2[3] = { 4,5,6 };
	int a3[3] = { 7,8,9 };
	int* arr[3] = { a1,a2,a3 };
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			printf("%d ", *(*(arr + i) + j));//其中*(arr+i)第一层解引用表示找到a[i]也就是找到那一层,然后第二层解引用表示找到具体的数据
		}
		printf("\n");
	}
	return 0;
}

提示:当然除了*(*(arr + i) + j)这个,arr[i][j]亦可以

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值