第6章 指针
基础知识
1、指针是一种数据类型
2、指针变量:存放变量的地址;指针变量的存储单元长度与其存放的地址值有关;编译程序通常采用4字节,以便实现跨内存段的访问;
3、直接访问:根据变量名查找地址进行访问;
间接访问:根据变量地址访问变量数据
4、指针变量通常只能被赋予已经定义好的变量的地址,而不能随便给个地址;
写法:char *pc = &c;
指针的运算
&和*运算
&取地址
*取内容
指针与整数的加减
char型,加1 = 1字节
int型,加1 = 2字节
实际上是,p+n*sizeof(数据类型)
例:*p++和*++p
指针相减
当两个指针相减时,编译程序按照
(两指针地址值之差)/ (一个数据项存储字节数)
意味着无论是int还是float,编译程序计算出的减法都是两个地址间相隔的元素个数,而不是字节数
关系运算
(1)> 和 <
p<q时只会有1(true)和0(false)两种答案;
(2)== 和 !=
(3)指针不能与一般数值比较,但是可以与 0和NULL 进行比较
除以上四种,其他指针运算都是非法的(比如加法)
指针与数组
一维
定义 int data[10];
数组data在程序运算过程中存储空间不会改变(p=data可以,但data=p不行),data即为存放起始地址的指针常量,
data与 &data[0]等价;data+i 与 &data[i]等价;
二维
二维数组必须指定第二个[]的大小
用指针变量输出二维数组的值;

指针与字符串
字符数组
可以用 %s读取时,遇到空格中断;
可以将char s[]定义方式,赋值给*ptr,ptr相当于与s一样的字符数组
必须提前定义好长度
字符串常量
无需定义长度,使用时直接 char *s = "your string"
可以使用下标方式访问各元素,如 s[2],但不能用对单个元素进行修改,只能对整个s重新赋值一个字符串常量;
允许s1=s2的赋值方式,但是strcpy和strcat第一个参数必须是字符数组;strlen和strcmp可以使用;
指针数组
int *pd[5] 定义了指针数组pd,由pd[0]~pd[4]五个元素组成,每个元素都可以存放一个指向int型的指针;
赋值:pd[2] = &value;
取值:x = *pd[2];
定义多个字符串:
(1)二维数组方法

(2)指针数组方法

同样,采用指针数组方法不能修改单个字符,相当于是字符串常量
指针数组比二维数组更方便,高效(?)
static int *num[5] = {&a[0], &a[1], &a[2], &a[3], &a[4]}
重要注意事项
(1)字符数组即char s[]定义的可以修改
char *s定义的字符串赋值给*ptr可以修改,
定义的字符串常量只能整体修改,例如char *s = "asdsads"; s = "scsgg"; 不能对单个字符修改,例如s[0] = 'k';
(2)char s[]定义的变量s,不可以执行s++操作,只能是char *s定义方式的可以

浙公网安备 33010602011771号