Jan 19, 2011

c/c++ 指针和数组

Array 翻译为数组,我认为很让人头疼,因为 Array 里面保存的不一定是数。比如二维Array保存的是一维Array。且c++ 的 Array 里可以存对象。

Array 更恰当的翻译是阵列。

1.
char str[] = "HELLO";

str长度为6,str[] 为一个字符串,可改变
内存中在栈内开了6个byte,存放字符串。
str这个符号的内容和它自己的地址是一样的,都指向了字符串的起始位置

若是
char * str = "HELLO";

内存中在静态区开了6个byte,存放字符串。
"HELLO"为常量字符串,不可改变

另外栈上还要开空间给str。str长度为4。
所以str的内容指向了字符串的起始位置,但它自己的地址在不同的内存空间(堆栈)
所以
str[0] = 'x';是错的

2.
指针不同于数组
数组:
a[i]
指向表示(a的地址+i)这个地址
指针:
p[i]
指向表示(p的内容+i)这个地址

1)
void Func(char string[10])
{
}
当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针!!

2)
File 1:
int a[100];
File 2:
external *a;
a[i]...
这是不允许的

编译器认为a为指针,取a的内容,加上i。但是a地址存放的不是地址

3)
一维数组和指针在相互赋值后可混用

int a[100];
int *p=a;

void function(char *p);
function(a);

a和p混用
但实质上不一样,用指针要多一次取值的开销

3. 多维阵列(参见 C++ primer)
多维阵列其实是阵列的阵列,即外层阵列的元素是阵列。
多维阵列是整齐阵列,不是 jagged 阵列


int a[][2] = {{1,2},{3,4}};

int ia[3][4];
int (*ip)[4] = ia; //*ip 是 int[4] 类型。
ip = &ia[2];
以上是对的

二维数组和二维指针绝对不可混用
int a[2][3];
int **p;
p=a;
这是错的

void function(int **p); 或 void function(int *p[]);
function(a);
这也是不对的

反而
int *p[];
int **p;
在赋值后可混用。

4. 函数定义
void f(int diff[4][4]);

函数调用
int diff[4][4];
f(diff);

0 comments: