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的区别 : 


 

其他不同点 : 

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变量, 编译时已经用地址替换掉了), 但是可以修改它指向的内容.

时间: 2024-12-29 01:56:39

array of arrays vs array of pointers的相关文章

Collection 和 Collections;Array与Arrays的区别

Collection 和 Collections的区别. Collection是个java.util下的接口,它是各种集合结构的父接口.继承与他的接口主要有Set 和List. Collections是个java.util下的专用静态类,它包含有各种有关集合操作的静态方法.提供一系列静态方法实现对各种集合的搜索.排序.线程安全化等操作. Array与Arrays的区别. 1.数组类Array,是Java中最基本的一个存储结构.提供了动态创建和访问 Java 数组的方法.其中的元素的类型必须相同.

php数组相加 array(“a”)+array(“b”)结果还是array(“a”)_php技巧

在网上看到一道题: array("a")+array("b")的结果是___ A.array("a","b")B.array("b","a")C.array("b")D.array("a") 答案:D php两个数组相加,为什么结果还是不变呢? 因为,它们等效于array("0″=>"a")+array(&quo

String,PChar,PByte,Array of Char,Array of Byte

string,pchar,pbyte,array of char,array of byte var   s:string;   pc:pchar;   pb:pbyte;   ac:array[1..100] of char;   ab:array[1..100] of byte;   i:integer; begin   s:='this is a test';   pc:=pchar(s);             //string->pchar   pb:=pbyte(pc);     

array multisort:数组 php array

$money = array (0 =>array ( 'money' => '21', 'time' => '2012-10-18', ),1 =>array ( 'money' => '28', 'time' => '2012-10-17', ),2 =>array ( 'money' => '92', 'time' => '2012-10-16', ),3 =>array ( 'money' => '428', 'time' =>

Java SE 8:标准库增强

Lambda表达式是Java SE 8的核心功能,大部分的改进都围绕lambda表达式展开.(Jigsaw项目已经被推迟到Java SE 9.)关于lambda表达式的内容,已经在上一篇文章中进行了说明.这篇文章主要介绍Java SE 8中包含的其他Java标准库的增强. 并行排序 随着多核CPU的流行,Java平台的标准库实现也尽可能利用底层硬件平台的能力来提高性能.Java SE 7中引入了Fork/Join框架作为一个轻量级的并行任务执行引擎.Java SE 8把Fork/Join框架用到

面试题两道,仰望高手解答!

问题描述 1.一个字符串数组(包括数字,字母,中文),先将其重复的元素去除(只去除后面重复的,不要把重复的两个都去除),然后将其进行排序,排序规则:先数字,后字母,再中文.2.将一个图片文件复制到一目录,此目录可能不存在. 解决方案 解决方案二:字符串数组比较?还是字符数组?解决方案三:第一个可以考虑用set集合第二个用C#比较好解决解决方案四:importjava.io.File;importjava.io.FileOutputStream;importjava.awt.Graphics;im

Ruby Study 4 : Array

Array class 1. introduce Ruby的Array类和其他的不太一样, Ruby中允许一个Array对象中存储不同类型的元素. 例如 : class Myclass end my1 = Myclass.new a1 = Array.new([1,"Digoal",[1,2,3,4,5],4,my1]) p a1 执行结果 :  [1, "Digoal", [1, 2, 3, 4, 5], 4, #<Myclass:0x1e11250>

asp.net C# array数组操作

数据是每一款开发应用程序都会用的,他是一ojb数据类型 哦,下面我们来看看关于.net数组吧,下面来看看一款简单扼要应用实例. using system; using system.collections.generic; using system.text; namespace funwitharrays { class program {     static void main(string[] args)     {       console.writeline("***** fun

List与array的相互转换

1.List->Array 调用List的toArray方法 List<String> list = new ArrayList<String>(); list.add("1"); list.add("2"); list.add("3"); String[] strings = list.toArray(new String[list.size()]); 2.Array->List 调用Array的asList