征服C指针 摘录 第1章---打好基础预备知识和复习。
C语言由B语言改良而来,一开始只是汇编器的替代品
C的字符串并非char的数组(汉字字符无法用一个字符对应一个字节表示)
内存(Memory)是计算机的重要部件之一,也称内存储器和主存储器,它用于暂时存放CPU中的运算数据,与硬盘等外部存储器交换的数据。它是外存与CPU进行沟通的桥梁,计算机中所有程序的运行都在内存中进,现在的计算机主要讲动态随机存取存储器用作主存储器
在计算机科学中,内存中每个用于数据存取的基本单位,都被赋予一个唯一的序号,称为地址,也叫做内存地址。内存地址指系统 RAM 中的特定位置,通常以十六进制的数字表示
- 在存储器里以字节为单位存储信息,为正确地存放或取得信息,每一个字节单元给以一个唯一的存储器地址,称为物理地址(Physical Address),又叫实际地址或绝对地址。
- 虚拟地址是Windows程序时运行在386保护模式下,这样程序访问存储器所使用的逻辑地址称为虚拟地址,与实地址模式下的分段地址类似,虚拟地址也可以写为“段:偏移量”的形式,这里的段是指段选择器。
C程序里使用的变量保存在内存中,各个变量都被分配了某个地址的内存,向量赋值就是把值保存在这个地址的内存中
C语言里用来保存变量的内存上的空间叫做对象,而被保存为对象的的数据类型叫做对象类型.
指针类型可以由函数类型、对象类型或不完全类型派生,派生指针类型的类型被称为被引用类型。指针类型描述了一种对象。其值用于引用被引用类型的实体。由被引用类型T派生的指针类型称为指向T的指针。由被引用类型构造指针类型的过程,称为指针类型的派生。这些构造派生类型的方法可以递归的应用。
指针类型其实不是单独存在的,它是由其他类型派生形成的。
先有指针类型,因为有了指针类型,所以有了指针类型的变量和指针类型的值。
变量不一定按照声明的顺序保存在内存中。
对变量使用&运算符可以获取该变量的地址,这个地址称为指向该变量的指针。
在大多数运行环境中,当程序运行时,无论是指向int的指针还是指向double的指针,其表现形式都是相同的。但他们读取的方式是不同的。通过声明,让编辑器记住是指向什么类型的指针,这样就可以顺利的通过指针获取值。
C语言在运行的时候,既没有类型信息也没有变量名。在C语言中记录指针指向何种类型是指到编译器为止的到了运行的时候就已经没有了相关信息。在运行时指针的值就只是单纯的地址而已。编译、链接后的机器码再引用变量是最终使用的是地址而不是变量名。
指针运算
对指针加N则指针前进该指针所指的指向的类型的长度乘以N。
空指针是一个特殊的指针值,它是一个保证不指向任何地址的指针,通常使用宏定义NULL作为表示空值的常量值。由于空指针可以确保与任何非空指针进行比较都不相等,所以经常作为返回指针的函数发生异常时的返回值进行使用。
字符串要以空字符 '\0' 结尾,而不能以空指针来结尾。 C语言标准里对空字符的定义是,所有位均为0的字节称为空字符。也就是说空字符是值为0的char类型。
空指针定义 :#define NULL ((void*)0)
形参与实参的区别:在调用函数时,实际传递的参数就是实参。接收实参的一方是形参。
fun(5) //5是实参
void func (int hoge) //hoge是形参
{
...
}
所谓数组就是指相同类型的变量,以确定的个数排列而成的集合。 C语言的数组是从0开始的。
下标运算符[]与数组毫无关系。无论有没有[],在表达式中,数组会被解读成指向其初始元素的指针。在数组使用的时候,array[i] ,*(array + i)二者是等价的。p[i]是*(p+i)的简便写法,下标运算符[]只有它原本的意义与数组毫无关系,p[i]甚至可以写成i[p]。
如果想要将数组作为函数参数传递,那就传递指向初始元素的指针。在C语言中,参数全部都是通过值传递的传递给函数的都是他的副本。传递指向初始元素的指针,其实就是传递的地址。如果需要对宿主进行值传递,需要将整个数组定义成结构体的成员。
int func(int *a); int func( int a[]); int func (int a[10] );三者行参声明都是同一个意思。

浙公网安备 33010602011771号