C语言复习整理(九)——数组与指针等结合知识点细分

数组知识点细节区分

学习数组,我们对于其必要的相关运算也必须要熟练掌握。在这里事先说明两点:数组名代表整个数组的时候只有两种情况:1.sizeof(数组名),这里的数组名表示整个数组。2.&数组名,这里的数组名表示整个数组。除1 2以外所有的数组名均表示首元素地址。
接下来用代码实例说明
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));
(输出结果为16。a代表整个数组,求的是整个数组的大小)
printf("%d\n",sizeof(a+0));(输出结果为4。a表示首元素地址,加0还是首元素地址,地址大小均为4个字节)
printf("%d\n",sizeof(*a));(输出结果为4。a表示首元素地址,对其解引用,求得是首元素的大小,int型为4个字节)
printf("%d\n",sizeof(a+1));(输出结果为4。首元素地址加1,表示的是数组第2个元素的地址)
printf("%d\n",sizeof(a[1]));(输出结果为4。数组第2个元素的大小)
printf("%d\n",sizeof(&a));(输出结果为4。取得是首元素的地址)
printf("%d\n",sizeof(&a+1));(输出结果为4。取出首元素的地址后加1表示求第二个元素的地址大小)
printf("%d\n",sizeof(&a[0]));(输出结果为4。取首元素的地址求大小)
printf("%d\n",sizeof(&a[0]+1));(输出结果为4。取首元素的地址再加1,求数组第二个元素的地址大小)

char arr[] = {‘a’,‘b’,‘c’,‘d’,‘e’,‘f’};
printf("%d\n", strlen(arr));
(输出结果是一个随机值。arr代表整个数组,计算时遇到‘\0’结束,而在该数组中没有‘\0’,因此是一个随机值)
printf("%d\n", strlen(arr+0));(输出结果是一个随机值。arr表示首元素地址,+0依旧是首元素地址,计算同上一条语句)
printf("%d\n", strlen(*arr));(arr表示首元素地址,解引用表示首元素,而strlen无法求一个确定的内容的元素个数,因此该条语句是错误的)
printf("%d\n", strlen(arr[1]));(情况同上一条语句)
printf("%d\n", strlen(&arr));(取得是首元素的地址,计算同该段代码第一条语句)
printf("%d\n", strlen(&arr+1));(输出结果是随机值,取首元素的地址,+1后是第二个元素的地址,从第二个元素开始计数遇到‘\0’结束)
printf("%d\n", strlen(&arr[0]+1));(输出结果是随机值,计算同上一条语句)

char *p = “abcdef”;
printf("%d\n", sizeof( p ));
(输出结果是4,p代表的是一个地址)
printf("%d\n", sizeof(p+1));(输出结果是4,p表示首字符的地址+1就是第二个字符的地址)
printf("%d\n", sizeof(*p));(输出结果是1,p是该字符串第一个字符的地址,解引用后就是第一个字符)
printf("%d\n", sizeof(p[0]));(输出结果是1,p[0]是该字符串第一个字符的地址)
printf("%d\n", sizeof(&p));(输出结果是4,取得是首字符的地址)
printf("%d\n", sizeof(&p+1));(输出结果是4,取首字符的地址后+1就是第二个字符的地址)
printf("%d\n", sizeof(&p[0]+1));(输出结果是4,取首字符的地址后+1就是第二个字符的地址)

printf("%d\n", strlen( p ));(输出结果是6,p代表的是字符串的地址,从字符a开始往后直到遇到‘\0’结束)
printf("%d\n", strlen(p+1));(输出结果是5,p表示首字符的地址+1就是第二个字符的地址,从字符b开始往后直到遇到‘\0’结束)
//printf("%d\n", strlen(*p));(解引用表示首元素,而strlen无法求一个确定的内容的元素个数,因此该条语句是错误的)
//printf("%d\n", strlen(p[0]));(情况同上一条语句)
printf("%d\n", strlen(&p));(输出结果是随机值)
printf("%d\n", strlen(&p+1));(输出结果是随机值)
printf("%d\n", strlen(&p[0]+1));(输出结果是5,p+1是p的下一个地址)
对于二维数组a[3][4],我们可以将其看作是一维数组,该数组中有3个一维数组a[0],a[1],a[2],每个一维数组中有4个元素。这种思想在我们以后的数组学习和使用中至关重要。
int a[3][4] = {0};
printf("%d\n",sizeof(a));
(输出结果为48,a表示整个数组)
printf("%d\n",sizeof(a[0][0]));(输出结果为4,a[0][0]表示数组中第一个元素)
printf("%d\n",sizeof(a[0]));(输出结果为16,a[0]表示该二维数组的首元素的地址,需要注意的是,此首元素是该二维数组中的第一行元素的集合)
printf("%d\n",sizeof(a[0]+1));(输出结果为4,a[0]表示该二维数组的首元素的地址,需要注意的是,此首元素是该二维数组中的第一行元素的集合,+1就是第二个元素,同样的,此第二个元素是该二维数组中第二行元素的集合)
printf("%d\n",sizeof(a+1));(输出结果为4,首元素的地址+1就是第二个元素的地址。)
printf("%d\n",sizeof(&a[0]+1));(输出结果为4,取得是该二维数组的首元素的地址,此首元素是该二维数组中的第一行元素的集合,+1就是第二个元素,同样的,此第二个元素是该二维数组中第二行元素的集合)
printf("%d\n",sizeof(*a));(输出结果为16,对该二维数组的首元素地址解引用后就是首元素)

数组作为函数参数
有时候我们在写代码时,会将数组作为参数传个函数。这里需要注意的是,数组作为函数参数的时候,不会把整个数组的传递过去。实际上只是把数组的首元素的地址传递过去了。所以即使在函数参数部分写成数组的形式:*int arr[]表示的依然是一个指针: int arr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值