新浪博客

数组名和指针变量的区别

2012-06-01 15:29阅读:
1. 数组名是常量,不能修改;而指针可以修改,让它指向别的位置。
2. 使用sizeof时,数组名返回的是整个数组包含的字节数,而指针返回的就是指针变量长度,在大部分机器上都是4个字节,即使这个指针指向一个字节的char,指针本身长度还是4
3. 取一个数组名的地址,所产生的是一个指向数组的指针,而不是一个指向常量值的指针。
示例1
int a[5]={1,2,3,4,5};
int b[3][5];
int *p1=&a[0]; //tag1,ok
int *p2=a; //tag2,ok
int (*p3)[5]=&a; //tag3
int (*p4)[5]=b; //tag4,ok
int *p5=b; //tag5,error
int *p6=&a; //tag6,error
说明:
tag1tag2:数组名表示数组首元素的地址,而其首元素是一个int,所以应该p1p2应该声明为int *
tag3a是数组首元素的地址,&a是数组地址,所以p3应该是一个指向数组的指针;
注意,用%p输出p1p2p3时,地址一样,但如果我们输出p1+1p2+1p3+1,则前两个移动4字节,而最后一个移动20字节(int4字节,而数组含5int)。
tag4b是数组b首元素的地址,而其首元素b[0]为一个5维数组,所以p4应该是一个指向5维数组的指针;
tag5:参看tag4
tag6:参看tag3.
再看一个例子:

示例2
void show1(char **p);
void show2(char p[][5]);

int main()
{
char b[3][5];
show1(b);
show2(b);

system('PAUSE');
return 0;
}
void show1(char **p1) {
printf('show1: %d, %d',sizeof(p1) ,sizeof(*p1));
}

void show2(char p2[][5]) {
printf('show2: %d, %d',sizeof(p2) ,sizeof(*p2));
}
输出结果:
show1: 4, 4
show2: 4, 5
说明:
p1p2都是指针,所以使用sizeof时都是4
但是p1是一个指向指针的指针,而p2则是指向数组的指针,也即*p1还是一个指针,而*p2则是一个5维的char数组,所以对它们使用sizeof分别得到45

我的更多文章

下载客户端阅读体验更佳

APP专享