【指针和数组笔试题(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;
}

总结

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

相关文章
|
18天前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
30 3
|
17天前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
29 2
|
25天前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
29 1
|
1月前
|
存储
如何使用指针数组来实现动态二维数组
指针数组可以用来实现动态二维数组。首先,定义一个指向指针的指针变量,并使用 `malloc` 为它分配内存,然后为每个子数组分配内存。通过这种方式,可以灵活地创建和管理不同大小的二维数组。
|
1月前
|
存储
如何通过指针数组来实现二维数组?
介绍了二维数组和指针数组的概念及其区别,详细讲解了如何使用指针数组模拟二维数组,包括定义与分配内存、访问和赋值元素、以及正确释放内存的步骤,适用于需要动态处理二维数据的场景。
|
1月前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
1月前
魔法指针 之 二级指针 指针数组
魔法指针 之 二级指针 指针数组
19 1
|
1月前
|
存储
一篇文章了解区分指针数组,数组指针,函数指针,链表。
一篇文章了解区分指针数组,数组指针,函数指针,链表。
18 0
|
1月前
|
编译器 C语言
【C语言】指针篇-深入探索数组名和指针数组- 必读指南(2/5)
【C语言】指针篇-深入探索数组名和指针数组- 必读指南(2/5)
|
3月前
|
搜索推荐 C语言
指针与数组
指针与数组
59 9