数组和指针的区别
数组名是数组第一个元素的地址,它是一个地址常量。对于常量,递增符号是不能使用的,因此操作数组ar[],ar++
或者++ar
都是非法的;而指针是一个变量,它指向数组第一个元素的地址,是可以通过指针操作变更指向地址的,因此对于指针变量p,p++
和++p
都是可以使用的。
字符串。C一般用数组存储字符串,数组和指针都能定义。当定义一个字符串时,字符串的内容将会自动拷贝一个副本到静态内存中,并为它分配地址。数组定义的字符串,是将静态内存中副本直接拷贝过来;而指针定义的字符串则存储的是静态内存中该字符串第一个字面量的地址。当程序需要多次使用相同的字符串时,就会直接在静态内存中引用它。此时,对指针定义的字符串进行修改,则会直接导致程序中各处引用发生变更,也就是“牵一发而动全身”。若不想修改字符串内容,则直接用数组定义就好了。示例如下:
int main(){
char *p="JERRY";
p[0]='M';
printf("JERRY");
printf(" IS %s","JERRY");
}
该程序输出为 MERRY IS MERRY
因为字符串字面量"JERRY"就是它在静态内存中的地址,指针p也指向了它,程序第三行直接修改了静态内存中"JERRY"的第一个元素,因此在后面从静态内存中获取该段地址时,其保存的内容已经发生改变。
指针数组和二维数组指针
定义上,指针数组char *ch[ROWS]
,二维数组指针char(*ch)[COLS]
,前者是数组,后者是指针。
指针数组一般用于定义字符串数组,本质上就是内含了ROWS个指针的数组,每个指针指向所在行第一个元素的地址。同样,指针数组是地址常量。
二维数组指针ch则是指向二维数组第一行地址的指针。第一行的地址和第一个元素的地址相同。
指针数组包含ROWS个指针,本质上是数组,二维数组指针本质上是指针变量。用指针数组定义二维数组和用二维数组指针定义二维数组,类似于定义数组和用指针定义数组。