加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

数组名和指针变量的区别

(2012-06-01 15:29:37)
标签:

c语言

数组名

指针变量

杂谈

分类: 零碎笔记

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\n",sizeof(p1) ,sizeof(*p1));

}

 

void show2(char p2[][5])  {

     printf("show2: %d, %d\n",sizeof(p2) ,sizeof(*p2));

}

输出结果:

show1: 4, 4

show2: 4, 5

说明:

p1p2都是指针,所以使用sizeof时都是4

但是p1是一个指向指针的指针,而p2则是指向数组的指针,也即*p1还是一个指针,而*p2则是一个5维的char数组,所以对它们使用sizeof分别得到45

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有