5. 指针与数组
C语言的灵魂
基础
- 指针是能够存放一个地址的一组存储单元,通常是2个字节或者4个字节
- 取地址,一元运算符&,只能作用于内存中的对象(变量,数组元素),不能作用于表达式,常量,register类型的变量
- 间接寻址/引用,一元运算符,*
- 指针变量也是变量,不是只能通过间接引用来使用,例如 ip = iq
int x = 1, y = 2, z[10];
int *ip; /* ip是是指向int类型的指针 */
ip = &x; /* ip现在指向x */
y = *ip; /* y的值现在是1 */
*ip = 0; /* x的值现在是0 */
ip =&z[0]; /* ip现在指向z[0] */
指针的运算
- 相同类型之间指针的赋值
- 指针同整数之间的加减法
- 指向相同数组的两个指针的减法或者比较
- 指针赋值为0,或者与0的比较,0通常定义为NULL
- 其他指针运算全部都是非法的
指针和数组
- 指针变量可以指向数组元素
- 指针的增减反映到指向数组的不同位置的元素
- 间接引用可以使用数组元素
- 数组名等于数组第一个元素的地址,数组名上可以进行间接寻址
- 指针和数组名的区别在于数组名不是变量,不能像变量一样操作它
- 字符指针
- 字符串常量 “I am a string”
- 是一个数组
- 可以作为函数参数,printf
- 可以作为右值
- 字符串常量 “I am a string”
char amessage[] = "now is the time"; /* 定义一个数组 */
char *pmessage = "now is the time"; /* 定义一个指针,指向一个字符串常量*/
这个区别就大了,amessage是可以修改内容的,pmessage指向的常量,是不能改变的。
- 字符串数组和字符指针的区别
- 数组和指针的区别,数组名不能变,指针可以变
- 数组通过下标的变化遍历,指针自增自减来移动
/* s