数组名和指针变量的区别
(2012-06-01 15:29:37)
标签:
c语言数组名指针变量杂谈 |
分类: 零碎笔记 |
1.
2.
3.
示例1:
int a[5]={1,2,3,4,5};
int b[3][5];
int
*p1=&a[0];
int *p2=a;
int
(*p3)[5]=&a;
int
(*p4)[5]=b;
int *p5=b;
int
*p6=&a;
说明:
tag1、tag2:数组名表示数组首元素的地址,而其首元素是一个int,所以应该p1、p2应该声明为int *;
tag3:a是数组首元素的地址,&a是数组地址,所以p3应该是一个指向数组的指针;
注意,用%p输出p1、p2、p3时,地址一样,但如果我们输出p1+1、p2+1、p3+1,则前两个移动4字节,而最后一个移动20字节(int是4字节,而数组含5个int)。
tag4:b是数组b首元素的地址,而其首元素b[0]为一个5维数组,所以p4应该是一个指向5维数组的指针;
tag5:参看tag4;
tag6:参看tag3.
再看一个例子:
示例2:
void show1(char **p);
void show2(char p[][5]);
int main()
{
}
void show1(char
**p1)
}
void show2(char
p2[][5])
}
输出结果:
show1: 4, 4
show2: 4, 5
说明:
p1、p2都是指针,所以使用sizeof时都是4;
但是p1是一个指向指针的指针,而p2则是指向数组的指针,也即*p1还是一个指针,而*p2则是一个5维的char数组,所以对它们使用sizeof分别得到4和5;