指针和数组综合

简介: 在前面我们学习了各种类型的指针,也得知了数组也与指针有着紧密的联系,所以接下来看一下指针与数组的综合题

在前面我们学习了各种类型的指针,也得知了数组也与指针有着紧密的联系,所以接下来看一下指针与数组的综合题

指针和数组综合

首先我们来复习一下

  • sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
  • &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
  • 除此之外所有的数组名都表示首元素的地址。
  • strlen语句中,计算字符串的长度,遇到\0才结束返回长度
//一维数组
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));//16     数组名单独放到sizeof中,计算的是整个数组的大小,结果是16
printf("%d\n",sizeof(a+0));//4/8  数组名不是单独放到sizeof中,这里的a表示数组首元素的地址,所以结果是指针的大小 4/8
printf("%d\n",sizeof(*a));//4     数组名不是单独放到sizeof中,a表示数组首元素的地址,解引用就是首元素,结果是4
printf("%d\n",sizeof(a+1));//4/8  数组名不是单独放到sizeof中,这里的a表示数组首元素的地址,a+1就是数组第二个元素的地址,结果是指4\8
printf("%d\n",sizeof(a[1]));//4   a[1]是数组首元素,大小是4
printf("%d\n",sizeof(&a));//4/8   &a,取出整个数组的地址,结果是4/8
printf("%d\n",sizeof(*&a));//16   解引用数组的地址,得到整个数组,大小是16
printf("%d\n",sizeof(&a+1));//4   数组的地址+1,类型仍是数组指针,大小4/8
printf("%d\n",sizeof(&a[0]));//4/8 取数组首元素的地址,大小是4/8
printf("%d\n",sizeof(&a[0]+1));// 4/8

//字符数组
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));//6     数组名单独放到sizeof中,计算整个数组的的大小,结果是6
printf("%d\n", sizeof(arr+0));//4/8 数组名并不是单独的,所以arr表示数组首元素地址,所以这里结果是4/8
printf("%d\n", sizeof(*arr));//1    数组名并不是单独的,所以arr表示数组首元素地址吗,再解引用,得到数组首元素,大小为1
printf("%d\n", sizeof(arr[1]));//1  arr[1]为数组首元素,大小为1
printf("%d\n", sizeof(&arr));//4/8  &arr,得到数组的地址,大小为4/8
printf("%d\n", sizeof(&arr+1));//4/8
printf("%d\n", sizeof(&arr[0]+1));//4/8 取数组首元素的地址,再+1,就是数组第二个元素的地址,大小为4/8
printf("%d\n", strlen(arr));//随机值    因为arr数组中没有\0,数组所占内存空间后面中在某个位置可能会有\0,所以是随机值
printf("%d\n", strlen(arr+0));//随机值  arr+0,表示数组首元素地址,结果仍是随机值
printf("%d\n", strlen(*arr));//错误     strlen中传的是一个地址,strlen(*arr)就是strlen('a')->strlen(97),
                                       //而97作为一个地址是不可以被访问的,非法访问
printf("%d\n", strlen(arr[1]));//错误   arr[1]是‘b’ASCII值是97,同样,非法访问
printf("%d\n", strlen(&arr));//随机值   &arr虽然是数组的地址,但是也是从数组起始位置开始的,数组中无\0,计算的还是随机值
printf("%d\n", strlen(&arr+1));//随机值 &arr是数组的地址,&arr+1是跳过整个数组的地址,求字符串长度也是随机值
printf("%d\n", strlen(&arr[0]+1));//随机值 &arr[0] + 1是第二个元素的地址,是'b'的地址,求字符串长度也是随机值
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));//7          这个字符数组中,最后有\0,所以长度是7
printf("%d\n", sizeof(arr+0));//4/8      arr+0表示数组首元素地址,4/8
printf("%d\n", sizeof(*arr));//1         arr不是单独的,表示数组首元素地址,解引用得到首元素,大小为1
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//4/8       &arr取出数组地址,大小是4/8
printf("%d\n", sizeof(&arr+1));//4/8     &arr取出数组地址,+1跳过一个数组指针大小的空间,大小仍是4/8
printf("%d\n", sizeof(&arr[0]+1));//4/8  &arr[0]为数组首元素地址,+1为第二个元素地址,大小为4/8
printf("%d\n", strlen(arr));//6       这个数组中有\0,所以得到长度为6
printf("%d\n", strlen(arr+0));//6     arr+0为数组首元素地址,大小为6
printf("%d\n", strlen(*arr));//错误,  *arr得到'a',ASCII值为97,strlen(97),非法访问
printf("%d\n", strlen(arr[1]));//错误,仍然非法访问
printf("%d\n", strlen(&arr));//6       &arr虽然是数组的地址,但是也是从数组起始位置开始的,结果是6
printf("%d\n", strlen(&arr+1));//随机值 &arr是数组地址,&arr+1跳过了整个数组的地址,后面地址中的内容不确定,所以是随机值
printf("%d\n", strlen(&arr[0]+1));//5  &arr[0]+1为第二个元素的地址,从第二个元素开始计算长度,结果是5
//字符指针
char *p = "abcdef";
printf("%d\n", sizeof(p));//4/8        p是字符指针,大小为4/8
printf("%d\n", sizeof(p+1));//4/8      p + 1是b的地址,是地址,就是4/8个字节
printf("%d\n", sizeof(*p));//1         *p是'a',sizeof(*p)计算的是字符的大小,是1字节
printf("%d\n", sizeof(p[0]));//1
printf("%d\n", sizeof(&p));//4/8       &p是二级指针,是指针大小就是4/8
printf("%d\n", sizeof(&p+1));//4/8     &p + 1是跳过p变量后的地址,4/8字节
printf("%d\n", sizeof(&p[0]+1));//4/8  p[0]就是‘a’,&p[0]就是a的地址,+1,就是b的地址,是地址就是4/8
printf("%d\n", strlen(p));//6         字符串长度
printf("%d\n", strlen(p+1));//5       p + 1是b的地址,求字符串长度就是5
printf("%d\n", strlen(*p));//错误     *p是'a',非法访问
printf("%d\n", strlen(p[0]));//错误   同上
printf("%d\n", strlen(&p));//随机值   &p拿到的地址是指针变量p的地址,随机值
printf("%d\n", strlen(&p+1));//随机值 &p+1是跳过p变量的地址,从这里开始求字符串长度也是随机值
printf("%d\n", strlen(&p[0]+1));//5  &p[0] + 1是b的地址,从b的地址向后数字符串的长度是5

//二维数组
int a[3][4] = {0};
printf("%d\n",sizeof(a));//求二维数组的大小,3*4*4 = 48
printf("%d\n",sizeof(a[0][0]));//4
printf("%d\n",sizeof(a[0]));//a[0]是第一行的数组名,数组名单独放在sizeof内部计算的就是数组(第一行)的大小,16个字节
printf("%d\n",sizeof(a[0]+1));//a[0]作为第一行的数组名,没有单独放在sizeof内部,没有取地址
//表示的就是第一行数组首元素的地址,那就是a[0][0]的地址,a[0]+1就是第一行第二个元素的地址,是地址就是4/8个字节
printf("%d\n",sizeof(*(a[0]+1)));//*(a[0] + 1)是第一行第2个元素,4个字节
printf("%d\n",sizeof(a+1));//a是二维数组的数组名,数组名表示首元素的地址,就是第一行的地址,a+1就是第二行的地址,4/8
printf("%d\n",sizeof(*(a+1)));//a+1是第二行数组的地址,*(a+1)表示的就是第二行,4*4 = 16
printf("%d\n",sizeof(&a[0]+1));//&a[0]是第一行的地址,&a[0]+1是第二行的地址,地址的大小就是4/8
printf("%d\n",sizeof(*(&a[0]+1)));//*(&a[0] + 1) 是对第二行的地址解引用,得到的就是第二行,计算的就是第二行的大小
printf("%d\n",sizeof(*a));//a表示首元素的地址,就是第一行的地址,*a就是第一行,计算的就是第一行的大小 16
printf("%d\n",sizeof(a[3]));//a[3]是第四行数组名,数组名单独放到sizeof内部,计算第四行的大小  16

经过这些题,相信大家对于数组与指针会有进一步的理解

Jambo!
+关注
目录
打赏
0
0
0
0
15
分享
相关文章
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
8月前
|
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
178 4
|
8月前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
98 2
|
8月前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
99 3
|
8月前
|
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
86 1
|
9月前
|
如何使用指针数组来实现动态二维数组
指针数组可以用来实现动态二维数组。首先,定义一个指向指针的指针变量,并使用 `malloc` 为它分配内存,然后为每个子数组分配内存。通过这种方式,可以灵活地创建和管理不同大小的二维数组。
|
9月前
|
如何通过指针数组来实现二维数组?
介绍了二维数组和指针数组的概念及其区别,详细讲解了如何使用指针数组模拟二维数组,包括定义与分配内存、访问和赋值元素、以及正确释放内存的步骤,适用于需要动态处理二维数据的场景。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问