第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定义方式的可以

posted @ 2021-03-05 20:49  头秃1997  阅读(126)  评论(0)    收藏  举报