C语言错题——期末

指针

        知识点

我们知道 数组名表示首元素地址 但有两种情况是例外的

1. sizeof(数组名)——数组名表示整个数组

2.&数组名——数组名表示整个数组的地址,&a+1就是跳过整个数组后的地址

3,         a=&a[0]=&a

int main(){
	int a[4]={1,2,3,4};
	printf("%d %d %d",a,&a[0],&a);
}//结果一样

4,sizeof和strlen(不计算'\0')区别

char arr[] = "abcdef";
 //这种初始化方式后面个默认有个'\0',也就是说这个数组的内容为abcdef\0
 
	printf("%d\n", sizeof(arr));———— 7
    printf("%d\n", srelen(arr));———— 6

5,

char* p = "abcdef"; 
	 /*很多以为这是把abcdef存在指针p中,其实这是错误的想法,
			它的本质是把首元素的地址存放在p中,
			这也就是把a的地址存放在p中*/

6,二维数组等式,a=&a[0]=&a[0][0]

a[0]也是数组名,该数组包含四个元素a[0][0]...故a[0]=&a[0][0]=a

对于a来说首元素地址就是第一行的地址
对于a[0]来说首元素地址就是a[0][0]的地址

    int a[3][4]={0};
即     int a[3][4]={    {0,0,0,0},        三行四列
                        {0,0,0,0},
                        {0,0,0,0},                  
};

    printf("%d\n", sizeof(a[0]));
	//16 a[0] 是首元素,对于二维数组来说 它的首元素为第一行的,a[0]其实相当于第一行
	// 的名称,相当于sizeof(第一行名称),表示整个数组的大小, 第一行有4个元素,所以
	//结果为 4*4   a[0]表示第一行,a[1]表示第二行....

	printf("%d\n", sizeof(a[0] + 1));
	//4/8  上面讲了,a[0]本质是第一行的名称,sizeof里面表示单独放数组名,
	//所以表示该数组的首元素地址,而第一行的首元素地址+1就是第一行第二个元素的地址

	printf("%d\n", sizeof(*(a[0] + 1)));
	//4  a[0]+1就是第一行第二个元素的地址,解引用就是该地址对应的元素值等同于a[0][1]

	printf("%d\n", sizeof(a + 1)); 
	//4/8 数组名不是单独放在sizeof里面,所以a表示二维数组首元素地址,对于二维数组来说 
	//它的首元素为第一行的地址,+1就是第二行地址
									
	printf("%d\n", sizeof(*(a + 1)));
	// 16  a+1为第二行地址,它是单独放在sizeof里面,所以表示整个数组大小
										
	printf("%d\n", sizeof(&a[0] + 1));
	//4/8 a[0]是第一行,&a[0]就是把整个数组的地址取出来,+1就是跳过整个数组指向
	//下一个数组,也就是指向第二行,本质还是数组
										
	printf("%d\n", sizeof(*(&a[0] + 1)));
	// 16  &a[0]+1是第二行地址,解引用(*)后就拿到第二行数组的名称,sizeof()
	//里面单独放数组名,表示整个数组的大小

	printf("%d\n", sizeof(*a));
	//16  数组名不是单独放在sizeof里面,所以表示二维数组的首元素地址,
	//二维数组的首元素地址就是第一行地址,解引用(*)后相当于sizeof(第一行名称),
	//数组名单独放里,所以是整个第一行数组的大小
	
	printf("%d\n", sizeof(a[3]));
	//16  a[3]相当于第四行地址,虽然这里没有第四行,但不影响它单独放在sizeof里面,
	//所以表示整个数组的大小,这个数组跟a[0],a[1]哪些是一样的道理,都是4个元素

        错题

printf("%d\n", sizeof(a + 0));——4

// 4 数组名不是单独放在sizeof里面,所以数组名表示首元素地址,

//首元素地址+0还是首元素地址,是地址在32位平台就4个字节,64位平台就8个字节

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值