《C语言深度解刨》阅读笔记 Ⅳ
第四章、指针和数组
-
当初始化指针时要注意:为防止指针地址是非法的要进行改写,使其指向合法内存。例如:int i=10;int*p=&i;*p=NULL;
-
注意NULL 就是NULL,它被宏定义为0:
#define NULL 0
很多系统下除了有NULL外,还有NUL(Visual C++ 6.0 上提示说不认识NUL)。NUL 是ASCII码表的第一个字符,表示的是空字符,其ASCII 码值为0。其值虽然都为0,但表示的意思完全不一样。同样,NULL 和0 表示的意思也完全不一样。一定不要混淆。 -
系统也指明了null的概念,其含义与NULL一致;然而,在实际应用中必须避免使用null.
-
将数值存入预先分配好的内存区域:
1. int*p=(int*)0x12ff7c;//强转
2. *p=0x100;
3. //可优化为:
4. (int*)0x12ff7c=0x100;
AI写代码
- 当我们定义一个数组a时,编译器基于指定的元素个数和元素类型预留一块内存空间(元素类型大小乘以元素个数),并将该内存空间的标识名为a。一旦该内存空间被标记为a,则其名称不可更改。
- 特别地,在32位系统环境下 sizeof(a[5]) 的返回值为4字节 sizeof 作为一个关键字并不是函数 在程序运行时计算数值 sizeof 的作用域是在编译阶段确定其大小。
- &a[0]与&a两者的内存地址是一致的 但含义存在差异 前者指的是数组首元素的位置 后者则是指整个数组起始的位置。
1. int a[5];={0};
2. &a+1=&a+5*sizeof(int);//为整个数组之后的地址
AI写代码
- 在赋值运算符‘=’右侧出现的是右值,在左侧出现的是左值。
当左值得时候,它表示内存地址。
当右值得时候,则表示该内存地址中存储的内容。
在赋值运算符左侧使用的符号所对应的内存地址中的内容必然可以被修改。
换句话说,在这种情况下我们无法对只读变量赋予新的数值。
*a表示右值时指向的是第一个元素的内存起始位置,并非整个数组的开头地址。
当a被用作赋值目标时(即作为左值),编程语言解释器将数组名视为第一个元素的内存起始位置。然而,在这种情况下,“该起始位置”所指代的只是一个单个内存区域,并不具备作为一个整体空间的能力。
- 指针与数组之间没有明显关联。
- 两种访问方式本质上没有区别,在形式上仅存在书写差异。
- 指针和数组本质上就是两个完全不同的概念。它们都可以通过特定的方式进行访问:一种是典型的具名+匿名访问(以指针形式),另一种则是完全的匿名访问(以下标形式)。
- 比较两者的异同

- 指针数组:它首先是一个由指针构成的数组;其占用的字节数则完全由自身决定。这种数据结构被称为"储存指针的数组"。
- 数组指针:它首先是一个指向特定内存区域的指针,并指示指向一个特定的内存区域。
在32位系统环境中通常占用4个字节;
同样地,在32位系统环境中通常占用4个字节;
至于被指向的那个内存区域所占据的空间大小,则目前尚不清楚。

强制将地址类型转换为其他类型。
当对指针变量进行算术运算时,并非直接使用其存储位置进行操作。
这些运算中的整数值通常以元素的数量而非单个字节的形式存在。
-
无法将一个数组传递给函数 C 语言中规定:当一维数组被用作函数参数时,默认会被编译器解析为指向该数组第一个元素内存地址的指针变量。
-
在C 语言中,在处理非数组形式的数据时(即对数据进行传值操作),都会采用传值方式(即将实际参数转换为独立副本后传递给被调用函数)。这种操作的特点是:虽然提供了一份拷贝以便于修改(但不会影响到实际参数),但仅能修改其内部副本的内容。
-
在C 语言中,在设计过程中必须明确的一点是:函数返回类型不能是数组。
-
在C 语言中,在编程过程中需要严格遵守的一个原则是:不允许将单个指针变量直接传递作为实参(即为被调用函数提供了一份独立的副本)。这种操作的原因在于:一旦实际参数已经被赋予了新的地址空间,则任何修改都不会反映到实际参数上。
在C语言中,在函数参数中使用一维数组时,默认情况下编译器将其解析为一个指向该数组起始元素地址的指针。这种特性仅限于一维数组的情况;当处理多维数组时(即维度超过一),将最外层维度重命名为指向该多维数组起始元素地址的指针后,则其余维度则不再允许进行修改。例如:形如a[3][4][5]的参数形式可被重命名为(*p)[4][5]。

- 函数指针
1. char * (*fun)(char * p1,char * p2);// 正确定义形式
2.
3. char * (*)(char * p1,char * p2) fan1;//辅助理解形式
4. int (*) [10] p;//类比
AI写代码
函数指针变量 这些变量将指向具有返回值类型为具有指向特性的数据项,并且每个变量都接受一个参数作为输入源
- 函数指针数组的指针:指向一个有指向函数的指针的数组。
