array of arrays vs array of pointers

我们知道array在编译的时候array 变量替换成指向array中的首地址. 所以没有也不需要地方存储array 变量.
这个pointer是截然不同的.
所以array of arrays 和 array of pointers 的不同可以从这个地方展开来讲, 下面举例来说明一下.

1. array of pointers : 
#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的区别 : 
array of arrays vs array of pointers - 德哥@Digoal - The Heart,The World.
 
其他不同点 : 
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变量, 编译时已经用地址替换掉了), 但是可以修改它指向的内容.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值