数组和指针

一维数组和指针

int array[3] = {1, 2, 3}
printf("&array:%p array:%p &array[0]:%p\n", &array, array, &array[0]);

&array表示的是整个数组的地址,array表示数组首地址,&array[0]第一个元素地址。三者打印出来的值都是相同的,但是表示的空间不同,其中array和&array[0]代表的是同一个空间,&array表示的是整个数组的空间。

array + 1 //指向第二个元素的地址,即array[1]的地址,即偏移sizeof(int)个字节
&array + 1 //向后偏移整个数组的大小,即3 * sizeof(int)个字节

int *p = array;
//p + 1 ---> &array[1] ---> array + 1 三者相同
//*(p + 1) ---> array[1] ---> *(array + 1) 三者相同

二维数组和数组指针
数组指针本质上是指针,指针指向的元素是数组。

/*array --> 代表第一行地址
array[0] --> 代表第一行第一个元素地址
*(array + 1) == array[1] --> 代表第二行第一个元素地址
array + 1 --> 代表第二行地址
array[1] + 1 --> 代表第二行第二个元素地址
&array --> 整个二维数组地址
&array + 1 --> 偏移整个二维数组大小*/

int main(int argc, char const *argv[])
{
	int array[2][3] = {1, 2, 3, 4, 5, 6};
	int (*p)[3] = array;

	printf("%d\n", array[1][1]);
	printf("%d\n", *((int *)(array + 1) + 1));
	printf("%d\n", *(array[1] + 1));
	printf("%d\n", *(p[1] + 1));
	printf("%d\n", *(*(p + 1) + 1));

	return 0;
}

上面五个打印出来的结果都是5。p是一个数组指针,指向的元素是一个拥有3个元素的一维数组。p[1]就表示array的第二行的首地址,p[1] + 1也就表示为第二行第二个元素的地址,再提取指针对于空间的值即为5。p + 1表示将指针偏移到array第二行的首地址,* (p + 1)表示了第二行第一个元素的地址,* (p + 1) + 1即表示第二行第二个元素的地址。
注意:* (p + 1)与p + 1所代表的空间是不同的,* (p + 1)代表一个int的空间,p + 1代表整个数组3个int的空间

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值