【指针和数组笔试题(1)】详解指针、数组笔试题

简介: 【指针和数组笔试题(1)】详解指针、数组笔试题

前言

在计算之前要了解基本概念:

数组名的理解

数组名是数组首元素的地址

有两个例外

1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组中的大小,单位是字节。

2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址


整型数组

#include<stdio.h>
int main()
{
  int a[] = { 1,2,3,4 };
  printf("%d\n", sizeof(a));

a是数组名,数组名单独放在sizeof内部,计算的是整个数组的大小,4*4=16,size(a)大小是16个字节

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

数组名a是数组首元素地址,a+0还是数组首元素地址,是地址就是4/8个字节

printf("%d\n", sizeof(*a));

*a=a[0],数组名a是数组首元素地址,*a就是首元素,求的是大小不是地址,整型的大小是4个字节

printf("%d\n", sizeof(a + 1));

数组名a是数组首元素地址,a+1是数组第二个元素地址,是地址就是4/8个字节

printf("%d\n", sizeof(a[1]));

a[1] = (a + 1),a是数组首元素地址,a+1是数组第二个元素地址,(a+1)就是第二个元素,就是求大小,整型数组大小就是4个字节。

printf("%d\n", sizeof(&a));

&a取出的是整个数组的地址,是地址就是4/8个字节

printf("%d\n", sizeof(*&a));

sizeof(*&a)=sizeof(a),这里的a表示整个数组,计算的是整个数组中的大小,单位是字节。4 * 4=16

printf("%d\n", sizeof(&a + 1));

&a表示整个数组的地址,&a+1表示跳过整个元素,依然是地址,是地址就是4/8个字节

printf("%d\n", sizeof(&a[0]));

&a[0]是数组首元素地址,4/8个字节

printf("%d\n", sizeof(&a[0] + 1));

&a[0]是数组首元素地址,&a[0] + 1就是数组第二个元素的地址,4/8个字节

return 0;
}

在x64的环境下就是8个字节,在x86环境下就是4个字节

通常使用的是x86环境

字符数组

第一组题

int main()
{
  char arr[] = { 'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));

arr单独放在sizeof内部,计算的是整个数组的大小,char类型的数组,单位是一个字节,1*6=6

printf("%d\n", sizeof(arr+0));

arr表示数组首元素地址,arr+0依旧是首元素的地址,是地址,就是4/8个字节

printf("%d\n", sizeof(*arr));

arr表示数组首元素地址,*arr表示首元素,注意计算的不是地址,是大小,首元素的大小是1个字节

printf("%d\n", sizeof(arr[1]));

arr[1]=*(arr+1),arr[1]表示第二个元素,注意计算的不是地址,是大小,第二个元素得大小是1个字节

printf("%d\n", sizeof(&arr));

&arr是整个数组的地址,是地址就是4/8个字节

printf("%d\n", sizeof(&arr+1));

&arr是整个数组的地址,&arr+1表示跳过整个数组,依旧表示地址,是地址就是4/8个字节

printf("%d\n", sizeof(&arr[0]+1));

&arr[0]是首元素的地址,&arr[0]+1是第二个元素的地址,是地址就是4/8个字节

return 0;
}


第二组题

strlen是库函数

作用是求字符串长度,统计的是在字符串中\0之前的字符的个数

如果没有\0就会一直往后找

int main()
{
  char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", strlen(arr));

因为字符数组arr中没有\0,所以在求字符串长度的时候,会一直往后统计字符串长度,产生的结果是随机值

printf(“%d\n”, strlen(arr + 0));

//arr是首元素地址,arr+0还是首元素地址, 和第一个一样,还是随机值

printf("%d\n", strlen(*arr));
//错误代码

arr是数组首元素地址,*arr是数组首元素,就是’a’,'a’的ASCII码值是97,

strlen函数参数需要传地址,那就是将97作为地址传给strlen,strlen就从97这个地址往后统计字符串长度,这就非法访问内存了

//错误代码
printf("%d\n", strlen(arr[1]));

arr[1]是数组第二个元素,‘b’,访问的是’b’的ASCII码值是98,所以也是错误代码

printf("%d\n", strlen(&arr));

&arr是数组的地址,数组的地址和首元素的地址一样,所以传递给strlen函数后,依然是从数组的第一个元素向后统计字符串长度,随机值

printf("%d\n", strlen(&arr + 1));

&arr是首元素地址,&arr+1跳过整个数组,从数组最末端向后统计字符串长度,结果也是随机值

printf("%d\n", strlen(&arr[0] + 1));

&arr[0] + 1是第二个元素地址,strlen从第二个元素地址向后统计字符串长度,结果也是随机值

return 0;
}


第三组题

int main()
{
  char arr[] = "abcdef";//里面实际放有[a b c d e f \0]
printf("%d\n", sizeof(arr));

arr单独放在sizeof里面,计算的是整个数组的大小,单位是字节,

char类型的数组,单位是一个字节,1*7=7,结果是7个字节

printf("%d\n", sizeof(arr+0));

arr表示首元素地址,arr+0还是表示首元素地址,是地址,就是4/8个字节

printf("%d\n", sizeof(*arr));//*arr=*(arr+0)=arr[0]

arr表示首元素的地址,*arr表示首元素,数组类型是char类型,单位是一个字节,所以首元素的大小是一个字节

printf("%d\n", sizeof(arr[1]));

arrp[1]表示第二个元素,大小是一个字节

printf("%d\n", sizeof(&arr));

&arr表示整个数组地址,地址是4、8个字节

printf("%d\n", sizeof(&arr+1));

&arr表示整个数组地址,&arr+1表示跳过整个数组,依然是地址,是地址就是4/8个字节

printf("%d\n", sizeof(&arr[0]+1));

&arr[0]表示首元素地址,&arr[0]+1表示第二个元素地址,是地址就是4/8个字节

return 0;
}

总结

以上就是第一部分的指针和数组笔试题和详细解释。

相关文章
|
21天前
|
存储 编译器 C语言
函数指针&&数组指针&&数组传参的本质&&字符指针(进阶篇)
函数指针&&数组指针&&数组传参的本质&&字符指针(进阶篇)
|
9天前
|
存储 人工智能 C++
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
29 1
|
9天前
|
存储 C语言
指针数组作为main函数的形参
指针数组作为main函数的形参
13 0
|
21天前
|
C语言
指针数组以及利用函数指针来实现简易计算器及typedef关键字(指针终篇)
指针数组以及利用函数指针来实现简易计算器及typedef关键字(指针终篇)
|
29天前
|
编译器
【C指针】深入理解指针(最终篇)数组&&指针&&指针运算题解析(一)3
【C指针】深入理解指针(最终篇)数组&&指针&&指针运算题解析(一)
|
29天前
|
编译器
【C指针】深入理解指针(最终篇)数组&&指针&&指针运算题解析(一)2
【C指针】深入理解指针(最终篇)数组&&指针&&指针运算题解析(一)
|
29天前
|
C语言
【C指针】深入理解指针(最终篇)数组&&指针&&指针运算题解析(一)1
【C指针】深入理解指针(最终篇)数组&&指针&&指针运算题解析(一)
175 51
|
2月前
|
存储 程序员 C++
指针数组和多重指针
指针数组和多重指针
17 2
|
2月前
|
存储 程序员 C++
使用字符指针变量和字符数组的比较
使用字符指针变量和字符数组的比较
15 1
|
2月前
|
存储 安全 Java
防止数组元素的指针被修改
防止数组元素的指针被修改
14 1