定义
定义指针变量。
一般形式: 类型 * 指针变量名
int *p;
基类型 指指针变量所指向的变量类型
特殊:定义行指针
格式:在定义后边用方括号指明基类型长度,*p用小括号括住
例如:
int (*p) [4] 表明该指针的基类型为4个整型变量
定义指针数组。
一般形式:类型名 * 数组名[ 数组长度]
int *p[5];
引用
一般
一维数组
引用一个数组元素,可用下面两种方法:
(1) 下标法,如a[i]形式
(2) 指针法,如*(a+i)或*(p+i) 其中a是数组名,p是指向数组元素的指针变量,其初值p=a
多维数组(行指针与列指针)
行指针:
a p
a+i p+i
列指针:
a[i] *(a+i) *(p+i)
a[i]+j *(a+i)+j *(p+i)+j
字符串
字符串是存放在字符数组中的。引用一个字符串,可以用以下两种方法。
(1) 用字符数组存放一个字符串,可以通过数组名和格式声明“%s”输出该字符串,也可以通过数组名和下标引用字符串中一个字符。
(2) 用字符指针变量指向一个字符串常量,通过字符指针变量引用字符串常量。
用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈,主要有以下几点。
(1) 字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),决不是将字符串放到字符指针变量中。
(2) 赋值方式。可以对字符指针变量赋值,但不能对数组名赋值。
char *a; a=”I love China!”; 对
char str[14];str[0]=’I’; 对
char str[14]; str=”I love China!”; 错
(3)初始化的含义
char *a=”I love China!”;与 char *a; a=”I love China!”;等价
char str[14]= ”I love China!”;与 char str[14]; str[]=”I love China!”; 不等价
(4) 存储单元的内容 编译时为字符数组分配若干存储单元,以存放各元素的值,而对字符指针变量,只分配一个存储单元
char *a; scnaf(“%s”,a); 错
char *a,str[10]; a=str; scanf (“%s”,a); 对
(5) 指针变量的值是可以改变的,而数组名代表一个固定的值(数组首元素的地址),不能改变。
(6) 字符数组中各元素的值是可以改变的,但字符指针变量指向的字符串常量中的内容是不可以被取代的。
(7) 引用数组元数
对字符数组可以用下标法和地址法引用数组元素(a[5],*(a+5))。
如果字符指针变量p=a,则也可以用指针变量带下标的形式和地址法引用(p[5],*(p+5))。
(8) 用指针变量指向一个格式字符串,可以用它代替printf函数中的格式字符串。
char *format;
format=”a=%d,b=%f\n”;
printf(format,a,b);
相当于 printf(“a=%d,b=%f\n”,a,b);
指针数组
一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都存放一个地址,相当于一个指针变量。
定义一维指针数组的一般形式为
类型名*数组名[数组长度];
int *p[4];
指针数组比较适合用来指向若干个字符串,使字符串处理更加方便灵活
可以分别定义一些字符串,然后用指针数组中的元素分别指向各字符串
由于各字符串长度一般是不相等的,所以比用二维数组节省内存单元