1. 指针的3个要素
理解C语言的关键是真正理解存储器
1. 不论是程序还是数据都是以“0”和“1”存放在存储器中;
2. 目前计算机系统的最小寻址单位是字节,其他存储单元都是在这个基础上组成的;
3. 每个存储单元都有两个属性:存储器存放的内容,存储单元的地址;
4. 当存放的内容是另一个存储单元的地址时,我们称这个存储单元里存放的是一个指针,而这个存储单元本身被称为指针变量;
5. 指针的本质是一个地址,而指针变量就是存放这个地址的存储单元;
6. 一个指针总是存放在存储器的某个存储单元上的;
7. 指针和指针变量名词一般会混用。
3个要素
1. 指针变量的值--一个地址
2. 指针指向的地址上的内容--指针变量存放的地址的内容
3. 指针变量本身的地址
2. 指针的类型
理解指针的关键是真正理解指针变量的值是一个地址,这个地址中存放了另外一个程序单元,这个指针变量指向该程序单元。
空类型(void *)指针是指该指针不指向某个特定的数据类型,仅仅作为一个内存的地址,可以赋值给任何类型。
3. 指针的运算
1. 同类型指针可以做减法运算
计算这两个指针的距离,sizeof(指针所指向的类型)为单位,而不是以字节为单位的。
2. 同类型的指针可以比较大小
大的含义是该指针所指向的地址位于高地址上。
3. 除了void *外,指针可以加减一个整数
指针加上或减去正整数n,含义是指针向高地址方向偏移n* sizeof(指针所指向的类型)个字节或者向低地址方向偏移n* sizeof(指针所指向的类型)。偏移的单位都是sizeof(指针所指向的类型)
4. 除了void *外,指针可以自增自减
是3的特例
3. 指针与字符串
1. C语言中没有字符串的数据类型,所以采用以'\0'字符结尾的字符数组。
2. C语言中所有以数组作为参数的函数最终实际上传递给函数内部的依然是这数组的首地址。
3. char *p = “Hello!”只是将字符串常量的首指针赋给了变量p。
4. 不推荐修改字符串常量。
char *p = "Hello!"; p[0] = 'h';不允许
char p[] = "Hello!"; p[0] = 'h';允许
因为char *p = "Hello!"; 字符串常量可能会映射到只读的ROM上
备注:字符串一般采用标准库函数操作