关于指针的一些练习(1)

文章介绍了C语言中二维数组的初始化,以及指针p、ptr和ptr1对数组元素的访问,包括通过逗号表达式、指针算术和类型转换来操作内存地址和元素值。
摘要由CSDN通过智能技术生成

1.

int main()
{
	int a[3][2] = { (0,1),(2,3),(4,5) };
	int* p;
	p = a[0];
	printf("%d", p[0]);
	return 0;
}

解析:a是一个3行2列的二维数组,对他进行初始化时大括号里面是逗号表达式,根据逗号表达式可以得到a数组中元素为1,3 ,5,0,0。p里面存放的是a[0]的地址,a[0]表示第一行的地址,表示首元素地址,也就是a[0][0]的地址,&a[0][0],p[0]相当于*(p+0),得到1

2.

int main()
{
	int a[5] = { 1,2,3,4,5 };
	int* ptr = (int*)(&a + 1);
	printf("%d,%d", *(a + 1), *(ptr - 1));
	return 0;
}

解析:*(a + 1)中的a表示首元素的当址,加1也就是向后访问4个字节,对其解引用就是2

*(ptr - 1)中ptr是数组a向后跳过一个数组的地址,可以参考下图:


3.


int main()
{
	int a[4] = {1,2,3,4};
	int* ptr1 = (int*)(&a + 1);
	int* ptr2 = (int*)((int)a + 1);
	printf("%x,%x", ptr1[-1], *ptr2);
	return 0;
}

解析:ptr1[-1]也就相当于*(ptr1+(-1)),ptr1里面存放的是数组a向后跳过一个整形数组的地址,减一也就是指向元素4的那个地址。第五行代码中将a的类型强制转换为整型,整形加一就是普通的算术运算,在对其进行强制类型转换为整型指针,指针访问的是4个字节,详细如下图(VS编译器默认是小端存储地址的)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值