有关指针和数组易错题

指针和数组笔试题

int main()
{
	int a[] = { 1,2,3,4 };
	printf("%d\n",sizeof(*&a));
	//&a取出的是整个数组的地址,地址是指针,这是一个数组指针
	//数组指针解引用,是数组,
	//是一个数组的大小
}
int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	//strlen是一个函数,传给strlen的是地址才行
	printf("%d\n", strlen(*arr));
	//arr数组名是数组首元素的地址,解引用是'a',a的ascll是97;strlen(97)
	//访问内存有错误,
	printf("%d\n", strlen(arr[1]));
	//也是错误
	printf("%d\n", strlen(&arr));
	//随机值
	printf("%d\n", strlen(&arr + 1));
	//随机值-6
	printf("%d\n", strlen(&arr[0] + 1));
	//随机值-5
	return 0;
}
int main()
{
	char arr[] = "abcdef";
	printf("%d\n", strlen(&arr + 1));
	//随机值
	return 0;
}
int main()
{
	char* p = "abcdef";
	printf("%d\n", strlen(&p));
	//取出的是p的地址,而p的地址不知道放在那里,
	//所以是随机值
	printf("%d\n", strlen(&p + 1));
	//随机值
	return 0;
}
int main()
{
	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a[0]));
	//a[0]第一行数组名。数组名放在sizeof()中,计算的是整个数组的大小
	//16
	printf("%d\n", sizeof(a[0] + 1));
	//a[0]单独放,表示第一行的大小,无单独放,也无取地址,表示第一个第一个元素的地址
	//a[0]+1表示第一行第二个元素的地址
	//4
	printf("%d\n", sizeof(*(a + 1)));
	//a+1表示第二行的地址,这是一个数组指针,数组指针解引用表示一个数组
	//16
	printf("%d\n", sizeof(*(&a[0] + 1)));
	//&a[0],表示第一行的地址,+1之后表示第二行数组的地址,解引用同上
	//16
	printf("%d\n", sizeof(*a));
	//a表示第一行数组的地址,解引用同上
	//16
	printf("%d\n", sizeof(a[3]));
	//sizeof只关注类型,不会真的访问第四行,假如有第四行
	//16
}
struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p;

//假设p的值为0x100000   
//已知,结构体Test类型的变量大小是20个字节
int main()
{
	printf("%p\n", p + 0x1);
	//0x100014
	printf("%p\n", (unsigned long)p + 0x1);
	//0x100001
	printf("%p\n", (unsigned int*)p + 0x1);
	//0x100004
	return 0;
}
int main()
{
	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]);
	//-4
	// 10000000000000000000000000000100
	// 11111111111111111111111111111011
	// 11111111111111111111111111111100
	//%p打印地址,直接认为这个值就是地址,而不会在有原码反码补码的概念
	//所以打印的是 ff ff ff fc
	//%d打印有符号整数
	//所以打印的还是-4
	return 0;
}

在这里插入图片描述

int main()
{
	char* c[] = { "ENTER","NEW","POINT","FIRST" };
	char** cp[] = { c + 3,c + 2,c + 1,c };
	char*** cpp = cp;
	printf("%s\n", **++cpp);
	//POINT
	printf("s\n", * -- * ++cpp + 3);
	//ER
	printf("%s\n", *cpp[-2] + 3);
	//ST
	printf("%s\n", cpp[-1][-1] + 1);
	//EW
	return 0;
}

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值