C语言----字符数组&&指针

简介: C语言----字符数组&&指针

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

sizeof分析类型就可以计算所占的内存空间的大小;

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

数组名单独放进里面,计算整个数组大小,所以是6字节;

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

第一个元素地址,是地址就是4或8,不会因为 是char类型而想成是1,因为无论是什么类型,地址的大小是不变的,就是4或8;

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

首元素地址,解引用后是第一个元素,char类型,1字节;

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

第二个元素,类型char,大小是1字节;

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

数组地址,4或8字节;

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

还是地址,虽然跳过整个数组,是地址就是4或8;

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

第二个元素地址,4或8字节;

-----------------------------------------------------------------------------------------------------------------

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

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

求字符串的长度,统计字符串斜杠0之前的字符个数,字符数组里面无斜杠0,会一直向后面找,答案是随机值;

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

这个还是从第一个向后找,所以是随机值;

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

strlen参数是地址,根据提供的地址向后找,*arr是首元素解引用就是字符a,ASCII值是97,会从97地址处开始找,所以是非法访问,非法访问97地址处的数值;

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

这个传递的参数同上,是98地址,非法访问;

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

chat(*)[6]转换成char*类型,数组的地址,和首个元素地址值相同,依然是从第一个元素位置开始找,所以是随机值;

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

跳过整个数组,还是地址,从最后开始找,是随机值;

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

从第二个元素的地址处往后找,是随机值;

这些随机值不是没有规律的,他们之间相差的是对应的字符的个数;

---------------------------------------------------------------------------------------------------------------------------------

3.char arr[] = "abcdef";

这里的末尾有了斜杠0

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

7个字节;

----------------------------------------

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

首元素地址,4/8

---------------------------------------------

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

首个元素,1字节;

--------------------------------------------

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

第二个元素,1字节;

------------------------------------------------

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

整个数组地址,4/8;

----------------------------------------------

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

还是地址,4/8;

----------------------------------------------

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

还是地址,4/8;

---------------------------------------------------------------------------------------------------------------------------------

4.char arr[] = "abcdef";

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

6字节;

-------------------------------------

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

6字节;

--------------------------------------

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

第一个元素,是字符a,这个是错误;

----------------------------------------

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

第二个元素,字符b,这个是错误;

---------------------------------------------

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

数组地址,6字节;

-------------------------------------------

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

跳过整个数组,也跳过了斜杠0,是随机值;

-------------------------------------------

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

跳过第一个字符,5字节;

--------------------------------------------------------------------------------------------------------------------------------

5.char *p = "abcdef";

这里p指向第一个元素地址

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

是地址,就是4/8字节;

------------------------------------

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

指向b字符,还是地址,是4/8字节;

-----------------------------------

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

访问a字符,大小是1字节;

------------------------------------

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

*(p+0)相当于*p,是1字节

------------------------------------

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

是地址,&p是二级指针,是p所在处的地址,地址是4/8;

--------------------------------------

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

还是地址,是4/8字节;

--------------------------------------

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

指向字符b,是地址,是4/8字节;

---------------------------------------------------------------------------------------------------------------------------

6.char *p = "abcdef";

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

从a开始,6字节;

-----------------------------------

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

从b开始,5字节;

-----------------------------------

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

非法访问,97地址处的内存,错误的;

----------------------------------------------

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

*(p+0),还是a,是错误的;

---------------------------------------------

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

是随机值;

----------------------------------------------

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

也是随机值;

---------------------------------------------------

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

从b开始找,所以是4字节;

相关文章
|
8天前
|
C语言
【c语言】指针就该这么学(1)
本文详细介绍了C语言中的指针概念及其基本操作。首先通过生活中的例子解释了指针的概念,即内存地址。接着,文章逐步讲解了指针变量的定义、取地址操作符`&`、解引用操作符`*`、指针变量的大小以及不同类型的指针变量的意义。此外,还介绍了`const`修饰符在指针中的应用,指针的运算(包括指针加减整数、指针相减和指针的大小比较),以及野指针的概念和如何规避野指针。最后,通过具体的代码示例帮助读者更好地理解和掌握指针的使用方法。
31 0
|
4天前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
9 1
|
10天前
|
存储 编译器 C语言
【c语言】数组
本文介绍了数组的基本概念及一维和二维数组的创建、初始化、使用方法及其在内存中的存储形式。一维数组通过下标访问元素,支持初始化和动态输入输出。二维数组则通过行和列的下标访问元素,同样支持初始化和动态输入输出。此外,还简要介绍了C99标准中的变长数组,允许在运行时根据变量创建数组,但不能初始化。
24 6
|
7天前
|
C语言
【c语言】指针就该这么学(3)
本文介绍了C语言中的函数指针、typedef关键字及函数指针数组的概念与应用。首先讲解了函数指针的创建与使用,接着通过typedef简化复杂类型定义,最后探讨了函数指针数组及其在转移表中的应用,通过实例展示了如何利用这些特性实现更简洁高效的代码。
11 2
|
7天前
|
C语言
如何避免 C 语言中的野指针问题?
在C语言中,野指针是指向未知内存地址的指针,可能引发程序崩溃或数据损坏。避免野指针的方法包括:初始化指针为NULL、使用完毕后将指针置为NULL、检查指针是否为空以及合理管理动态分配的内存。
|
7天前
|
C语言
C语言:哪些情况下会出现野指针
C语言中,野指针是指指向未知地址的指针,通常由以下情况产生:1) 指针被声明但未初始化;2) 指针指向的内存已被释放或重新分配;3) 指针指向局部变量,而该变量已超出作用域。使用野指针可能导致程序崩溃或不可预测的行为。
|
13天前
|
存储
如何使用指针数组来实现动态二维数组
指针数组可以用来实现动态二维数组。首先,定义一个指向指针的指针变量,并使用 `malloc` 为它分配内存,然后为每个子数组分配内存。通过这种方式,可以灵活地创建和管理不同大小的二维数组。
|
7天前
|
编译器 C语言
【c语言】指针就该这么学(2)
本文详细介绍了指针与数组的关系,包括指针访问数组、一维数组传参、二级指针、指针数组和数组指针等内容。通过具体代码示例,解释了数组名作为首元素地址的用法,以及如何使用指针数组模拟二维数组和传递二维数组。文章还强调了数组指针与指针数组的区别,并通过调试窗口展示了不同类型指针的差异。最后,总结了指针在数组操作中的重要性和应用场景。
10 0
|
19天前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
30 3