【C 练习】指针练习

【1】

int a[5] = { 1, 2, 3, 4, 5 };
int* ptr = (int*)(&a + 1);

printf("%d,%d", *(a + 1), *(ptr - 1));

答案: 2,5

由于 ptr 的类型是 int*,所以 -1 只访问 4 字节。

【2】

struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p;
//假设p 的值为0x000000。 如下表表达式的值分别为多少?(32位平台下)
//已知,结构体Test类型的变量大小是20个字节
int main()
{
	printf("%p\n", p + 0x1);                 //1
	printf("%p\n", (unsigned long)p + 0x1);  //2
	printf("%p\n", (unsigned int*)p + 0x1);  //3
	return 0;
}

答案:

(1)0x0000014

因为 0x1 = 1,所以 p + 0x1 等于 p + 1

(2)0x0000001

0x0000000 + 0x0000001 = 0x0000001

(3)0x0000004

int* 一次只能访问 4 字节。

【3】

int a[4] = { 1, 2, 3, 4 };
int* ptr1 = (int*)(&a + 1);
int* ptr2 = (int*)((int)a + 1);

printf("%x,%x", ptr1[-1], *ptr2);
//小端存储模式

答案:4,2000000

 【4】

int a[3][2] = { (0, 1), (2, 3), (4, 5) };
int* p;
p = a[0];

printf("%d", p[0]);

答案:1

(0,1)(2,3)(4,5)是逗号表达式

 【5】

int a[5][5];
int(*p)[4];
p = a;

printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);

答案:FFFFFFFC,-4

p[4][2] = *(*(p+4)+2)

地址 - 地址 = 中间元素个数

 -4 在内存中存放的是补码,当用地址的方式打印时,由于地址没有正负数的概念,所以直接会直接将补码打印出来。

【6】

int a[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int* ptr1 = (int*)(&a + 1);
int* ptr2 = (int*)(*(a + 1));

printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));

答案:10,5

 【7】

char* a[] = { "work","at","alibaba" };
char** pa = a;
pa++;

printf("%s\n", *pa);

答案:at

char* 中放的是首元素地址,不是整个字符串。

  【8】

char* c[] = { "ENTER","NEW","POINT","FIRST" };
char** cp[] = { c + 3,c + 2,c + 1,c };
char*** cpp = cp;

printf("%s\n", **++cpp);          //1
printf("%s\n", *-- * ++cpp + 3);  //2
printf("%s\n", *cpp[-2] + 3);     //3
printf("%s\n", cpp[-1][-1] + 1);  //4

答案:

前、后置 ++、- - 会更改变量原来的值。

(1)POINT

 (2)ER

 (3)ST

 (4)EW

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值