5、数组和指针的关系
int *p;//定义一指针变量p
int a[n];//定义一个长度为n的一维数组a
则: a[i] 等价于 *(p+i);&a[i] 等价于 *(a+i)。
int *p;//定义一指针变量p
int a[m][n];//定义一个二维数组a
则:*(a[i]+j)等价于 *(*(a+i)+j)等价于 a[i][j]; a[i]+j 等价于 *(a+i)+j 等价于 &a[i][j]。
对二维数组来说:a、a+i、a[i]、*(a+i)、*(a+i)+j、a[i]+j都是地址,而 *(a[i]+j)和 *(*(a+i)+j)是二维数组元素 a[i][j] 的值。
对二维数组来说,对应的地址的关系如下:
a 表示二维数组名,指向一维数组 a[0],即0行首地址;
a [0],*(a+0),*a 表示0行0列元素地址;
a+1,&a[1] 表示1行首地址;
a[1],*(a+1)表示1行0元素a[1][0]的地址
a[1]+2,*(a+1)+2,&a[1][2]表示1行2列元素a[1][2]的地址
指向多维数组元素的指针变量,它包含:
1)指向数组元素的指针变量
例:int *p;//定义一指针变量p
int a[m][n];//定义一个二维数组a
令p=a[0];//a[0]表示二维数组a[m][n]的0行0列元素的地址
p++;//由上式知道p++表示指向二维数组a[m][n]下一个元素,即是下一个元素的地址
则 *p 表示输出二维数组a[m][n]下一个元素的值,若每次p++,则可得到二维数组的每个元素
2)指向由m个元素组成的一维数组的指针变量
例:int *p;//定义一指针变量p
int a[m][n];//定义一个二维数组a
令p=&a[0];//&a[0]表示二维数组a[m][n]的0行的首地址
p++;//由上式知道p++表示指向二维数组a[m][n] 得1行的首地址,p的增值以一维数组的长度为单位
则 *p 表示输出二维数组a[m][n]的a[1][0]值,即1行0列元素的值。
若定义 int(*p)[n] ,其中p是一个指针变量,则表示p指向包含n个整型元素的一维数组,即p是指向一维数组的指针。
注意:指针变量的值可以改变,而数组名虽然代表数组的地址,但它是个常量,它的值不能被改变。
6、字符串与指针
在C语言中,可以用两种方式访问一个字符串
1)用字符数组存放一个字符串,然后输出该字符串
例:char str[]="Hello world!";//定义一个字符数组
printf("%s",str);//输出该字符串
2)用字符指针指向一个字符串
例:char *str="Hello world!";//定义一个字符指针str,把字符串常量第一个元素的地址赋给str,用它指向字符串常量"Hello world!"
printf("%s",str);//输出该字符串,因为系统先输出指针变量str指向的一个字符数据,然后自动使str加1,使之指向下一个字符,然后输出,知道遇到字符串结束标志 '\0' 为止。注意在内存中,字符串的最后被自动加了一个 '\0',故在输出时能自动确定字符串的终止位置。
说明:通过字符数组名或字符指针变量可以输出一个字符串。而对于一个数值型数组,是不能用数组名输出它的全部元素的。
字符指针作函数参数
将一个字符串从一个函数传递到另一个函数,可以用地址传递的办法,及用字符数组名作参数,也可以用指向字符的指针变量作参数。
字符指针可以作形参和实参。
字符指针变量和字符数组的关系
1)字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第一个字符的地址)
2)赋值方式。对字符数组只能对各个元素赋值,
char str[]="Hello world!";//字符数组赋值方式,它可以在定义时整体赋初值,但不能在赋值语句中整体赋初值。如:str[]="Hello world!"这样赋初值是不行的。
char *a; a="Hello world!";//字符指针变量的赋值方式,a是字符串第一个元素的地址。
3)对字符指针变量赋初值。
char *a="Hello world!";等价于 char *a; a="Hello world!";//字符指针变量可以在赋值语句中整体赋初值。
4)若定义了一个字符数组,在编译时为它分配了内存单元,他有确定的地址,但是字符指针变量若未对它赋初值,则它将指向一个不确定的字符数据。
5)指针变量的值可以改变,但是字符数组名不能改变。
char *a="Hello world!"; a=a+7;
6)用指针变量指向一个格式字符串,可以用它代替printf函数中的格式字符串。
char *format="a=%d,b=%f\n";
printf(format,a,b);
7、指针数组和指向指针的指针
1)指针数组:指的是对一个数组,若其元素均为指针类型数据,则称为指针数组。即指针数组中的每一个元素都相当于一个指针变量。
一维指针数组: 类型名 * 数组名[数组长度]
如:int * p[5]={"Computer","Jun","Ying","Love","Ios"};//表示指针数组p有5个元素,起初值分别是"Computer"、"Jun"、"Ying"、"Love"和"Ios"的起始地址。
2)指向指针的指针:即指向指针数据的指针变量
如:char *a[]={"Computer","Jun","Ying","Love","Ios"};//定义一个指针数组
char **p;//定义了一个指向字符数据的指针变量
int i; p=a+i;//使 p 指向指针数组a的 i 号元素 a[i]
printf("%s\n",*p);//则输出数组a的第(i+1)个字符串
3)指针数组作main函数的形参
如:void main(int argc,char *argv[])
8、void指针类型
它指的是可以定义一个指针变量,但是不指定它是指向哪一种类型数据。
例:void *p1;//定义一个void型的指针变量p1
char *p2;//定义一个char型的指针变量p1
p1=( void *)p2;//用(void *)p2将p2的值转换成void * 类型。
void * fun(char ch1,char ch2)//定义void * 类型的函数fun
|
|