C语言第二十四弹---指针(八)

简介: C语言第二十四弹---指针(八)



1、数组和指针笔试题解析

1.1、字符数组

  1.1.1、代码1:

char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));

char arr[] = {'a','b','c','d','e','f'};

//单引号初始化的字符数组,有几个字符则实际存储几个字符,数组内容有"abcdef"

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

//数组名单独放在sizeof内部,代表整个数组,因此为6字节。

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

//数组名表示首元素地址,+0还是首元素地址,实质是地址,在x64环境为8字节,x86环境为4字节。

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

//数组名为首元素地址,解引用为首元素,类型为char,因此大小为1字节。

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

//arr[1]为第二个元素,类型为char,因此大小为1字节。

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

//&arr为整个数组地址,但是实质还是地址,在x64环境为8字节,x86环境为4字节。

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

//&arr为整个数组地址,+1则走数组大小步,但是实质还是地址,在x64环境为8字节,x86环境为4字节。

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

//arr[0]为第一个元素,&arr为第一个元素地址,+1则走char类型步,但是实质是地址,x64环境为8字节,x86环境为4字节。

1.1.2、代码2:

char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));

strlen计算的是'\0'之前的字符个数,参数为指针。

size_t strlen ( const char * str );

char arr[] = {'a','b','c','d','e','f'};

//单引号初始化的字符数组,有几个字符则实际存储几个字符,数组内容有"abcdef"

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

//arr为数组首元素地址,在数组初始化中没有'\0',但是strlen会一直执行,直到找到'\0'才停止计算,因此该值为大于等于字符串长度6的随机值。

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

//arr为数组首元素地址,arr+0还是首元素地址,在数组初始化中没有'\0',但是strlen会一直执行,直到找到'\0'才停止计算,因此该值为大于等于字符串长度6的随机值。

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

//arr为首元素地址,*arr为数组第一个元素,但是函数参数要求为指针,此处为char类型的值,因此该代码错误。

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

//arr[1]为第二个元素,但是函数参数要求为指针,此处为char类型的值,因此该代码错误。

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

//&arr为整个数组地址,但是该地址的值还是首元素地址的值,在数组初始化中没有'\0',但是strlen会一直执行,直到找到'\0'才停止计算,因此该值为大于等于字符串长度6的随机值。

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

//&arr为整个数组地址,+1则走整个数组大小步,但是我们并不知道'\0'的位置,因此该值为大于等于字符串长度6的随机值。

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

//&arr[0]为第一个元素地址,+1则为第二个元素地址,在数组初始化中没有'\0',但是strlen会一直执行,直到找到'\0'才停止计算,因此该值为大于等于字符串长度6的随机值。

注:想要得到结果,需要注释掉其中两个错误代码,否则会引发下面的异常。

代码2运行结果及分析:

1.1.3、代码3:

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

char arr[] = "abcdef";

//双引号包裹的字符串在末尾会自动加'\0',因此字符串实际的内容有abcdef\0。

//sizeof计算的是占用空间大小,大小为字节。

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

//数组名arr单独放在sizeof内部代表整个数组大小,因此为7字节(\0占用一个字节)。

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

//数组名arr不是单独放在sizeof内部,表示首元素地址,+0还是首元素地址,在x86环境下为4字节,x64环境为8字节。

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

//数组名arr不是单独放在sizeof内部,表示首元素地址,*arr为首元素,类型为char,因此为1字节。

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

//arr[1]为第二个元素,类型为char,因此为1字节。

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

//&arr为整个数组的地址,但是实质还是地址,在x86环境下为4字节,x64环境为8字节。

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

//&arr为整个数组的地址,+1则走整个数组大小步,但是实质还是地址,在x86环境下为4字节,x64环境为8字节。

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

//&arr[0]为首元素地址,+1则走一个char类型大小步,即为第二个元素地址,在x86环境下为4字节,x64环境为8字节。

1.1.4、代码4:

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

char arr[] = "abcdef";

//双引号包裹的字符串在末尾会自动加'\0',因此字符串实际的内容有abcdef\0

//strlen计算的是'\0'之前的字符个数,需要包含头文件#include<string.h>

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

//数组名arr为数组首元素地址,首元素到'\0'之间有6个元素,因此长度为6。

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

//数组名arr为数组首元素地址,+0还是首元素地址,首元素到'\0'之间有6个元素,因此长度为6。

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

//数组名arr为数组首元素地址,*arr为首元素,但是函数的参数为指针,参数不匹配,因此该代码错误。

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

//arr[1]为第二个元素,但是函数参数为指针,参数不匹配,因此该代码错误。

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

//&arr为整个数组地址,地址的值为首元素地址的值,首元素到'\0'之间有6个元素,因此长度为6.

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

//&arr为整个数组地址,+1则走整个数组大小步,此时不知道'\0'在什么位置,因此为随机值。

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

//&arr[0]为首元素地址,+1位第二个元素地址,第二个元素到'\0'之间有5个元素,因此长度为5。

注:想要得到结果,需要注释掉其中两个错误代码。

1.1.5、代码5:

char *p = "abcdef";
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(p+1));
printf("%d\n", sizeof(*p));
printf("%d\n", sizeof(p[0]));
printf("%d\n", sizeof(&p));
printf("%d\n", sizeof(&p+1));
printf("%d\n", sizeof(&p[0]+1));

char *p = "abcdef";//此处为字符常量

//p为指针变量,指向字符常量的首元素地址

printf("%d\n", sizeof(p));

//p为指针变量,指向第一个字符,x64环境大小为8字节,x86环境为4字节。

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

//p为指针变量,p+1同样为指针变量,走char类型大小步,指向第二个字符,x64环境大小为8字节,x86环境为4字节。

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

//p为指针变量,指向第一个字符,*p则为第一个字符,类型为char,因此为1字节。

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

//p[0]为第一个字符,类型为char,因此为1字节。

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

//p为指针变量,指向第一个字符,&p为指针变量的地址,x64环境大小为8字节,x86环境为4字节。

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

//p为指针变量,指向第一个字符,&p为指针变量的地址,&p+1同样为地址,x64环境大小为8字节,x86环境为4字节。

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

//&p[0]为第一个字符的地址,+1位第二个字符的地址,x64环境大小为8字节,x86环境为4字节。

1.1.6、代码6:

char *p = "abcdef";
printf("%d\n", strlen(p));
printf("%d\n", strlen(p+1));
printf("%d\n", strlen(*p));
printf("%d\n", strlen(p[0]));
printf("%d\n", strlen(&p));
printf("%d\n", strlen(&p+1));
printf("%d\n", strlen(&p[0]+1));

char *p = "abcdef";//此处为字符常量

//p为指针变量,指向字符常量的首元素地址

printf("%d\n", strlen(p));

//p为指针变量,指向第一个字符,第一个字符到'\0'之间有6个元素,因此长度为6。

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

//p为指针变量,p+1同样为指针变量,走char类型大小步,指向第二个字符,第二个字符到'\0'之间有5个元素,因此长度为5。

printf("%d\n", strlen(*p));

//p为指针变量,指向第一个字符,*p则为第一个字符,但是函数参数为指针,参数不匹配,因此该代码错误。

printf("%d\n", strlen(p[0]));

//p[0]为第一个字符,但是函数参数为指针,参数不匹配,因此该代码错误。

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

//p为指针变量,指向第一个字符,&p为指针变量的地址,该地址到'\0'之间不知道有几个元素,因此为随机数。

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

//p为指针变量,指向第一个字符,&p为指针变量的地址,&p+1同样为地址,该地址到'\0'之间不知道有几个元素,因此为随机数。

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

//&p[0]为第一个字符的地址,+1位第二个字符的地址,第二个字符到'\0'之间有5个元素,因此长度为5。

数组名的意义:

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

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

3. 除此之外所有的数组名都表示首元素的地址。

总结

本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!

相关文章
|
2月前
|
C语言
【c语言】指针就该这么学(1)
本文详细介绍了C语言中的指针概念及其基本操作。首先通过生活中的例子解释了指针的概念,即内存地址。接着,文章逐步讲解了指针变量的定义、取地址操作符`&`、解引用操作符`*`、指针变量的大小以及不同类型的指针变量的意义。此外,还介绍了`const`修饰符在指针中的应用,指针的运算(包括指针加减整数、指针相减和指针的大小比较),以及野指针的概念和如何规避野指针。最后,通过具体的代码示例帮助读者更好地理解和掌握指针的使用方法。
56 0
|
19天前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
73 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
19天前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
44 9
|
19天前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
40 7
|
1月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
101 13
|
23天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
23天前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
74 3
|
24天前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
1月前
|
存储 C语言 开发者
C 语言指针与内存管理
C语言中的指针与内存管理是编程的核心概念。指针用于存储变量的内存地址,实现数据的间接访问和操作;内存管理涉及动态分配(如malloc、free函数)和释放内存,确保程序高效运行并避免内存泄漏。掌握这两者对于编写高质量的C语言程序至关重要。
52 11
|
23天前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
35 1