我们知道array在编译的时候array 变量替换成指向array中的首地址. 所以没有也不需要地方存储array 变量.
这个pointer是截然不同的.
所以array of arrays 和 array of pointers 的不同可以从这个地方展开来讲, 下面举例来说明一下.
1. array of pointers :
2. array of arrays :
可以从一维的数组看array在C中不能指向其他地址则更加明朗 :
使用指针则可以修改 :
虽然array变量本身不能修改起地址值, 但是array中存储的值是可以被修改的如 :
#include <stdio.h>
char *a[] = {"abc","defgh"};
int main() {
printf("addr a[0]:%p , addr a[1]:%p\n", a[0], a[1]);
printf("a[0]:%s , a[1]:%s\n", a[0], a[1]);
a[0]=a[1];
printf("addr a[0]:%p , addr a[1]:%p\n", a[0], a[1]);
printf("a[0]:%s , a[1]:%s\n", a[0], a[1]);
return 0;
}
结果 :
[root@db-172-16-3-150 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./m.c -o m && ./m
addr a[0]:0x400648 , addr a[1]:0x40064c
a[0]:abc , a[1]:defgh
addr a[0]:0x40064c , addr a[1]:0x40064c
a[0]:defgh , a[1]:defgh
[root@db-172-16-3-150 zzz]# cat m.c
2. array of arrays :
#include <stdio.h>
char a[][10] = {"abc","defgh"};
int main() {
printf("addr a[0]:%p , addr a[1]:%p\n", a[0], a[1]);
printf("a[0]:%s , a[1]:%s\n", a[0], a[1]);
a[0]=a[1];
printf("addr a[0]:%p , addr a[1]:%p\n", a[0], a[1]);
printf("a[0]:%s , a[1]:%s\n", a[0], a[1]);
return 0;
}
结果, 由于array变量不存在, 它在编译时已经替换成地址了, 所以修改array变量的指向也是不允许的.
[root@db-172-16-3-150 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./m.c -o m && ./m
./m.c: In function ‘main’:
./m.c:7: error: incompatible types in assignment
可以从一维的数组看array在C中不能指向其他地址则更加明朗 :
[root@db-172-16-3-150 zzz]# cat n.c
#include <stdio.h>
char a[] = "abcde";
int main() {
char b[] = "efg";
a = b;
printf("a:%s\n", a);
return 0;
}
结果
[root@db-172-16-3-150 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./n.c -o m && ./n
./n.c: In function ‘main’:
./n.c:6: error: incompatible types in assignment
使用指针则可以修改 :
[root@db-172-16-3-150 zzz]# cat n.c
#include <stdio.h>
char *a = "abc";
int main() {
char b[] = "efghi";
a = b;
printf("a:%s\n", a);
return 0;
}
结果
[root@db-172-16-3-150 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./n.c -o n && ./n
a:efghi
虽然array变量本身不能修改起地址值, 但是array中存储的值是可以被修改的如 :
[root@db-172-16-3-150 zzz]# cat n.c
#include <stdio.h>
char a[] = "abc";
int main() {
*a = '1';
printf("a:%s\n", a);
return 0;
}
结果
[root@db-172-16-3-150 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./n.c -o n && ./n
a:1bc
用图来描述array of arrays 与array of pointers的区别 :
其他不同点 :
1. array of arrays , 第二个维度必须定义长度, 也就是说每个数组的长度是一样的.
如a[][10], 每个数组长度是10; 因此 a+1 位移10字节.
2. array of pointers则不需要限定长度
如 * a[], 因为a 存储的是指针, 一般一个指针占用4字节. 也就是说a+1, 位移4字节.
3. 虽然array of pointers 可以修改array中存储的指针值, 但是无法修改指向的内容的值, 因为它们指向的是constants区域的字符串常量.
相反, array of array则不能修改它指向的指针值(因为不存在array变量, 编译时已经用地址替换掉了), 但是可以修改它指向的内容.