数组和指针

cg05568256068 2009-04-22 05:17:46
请教大家一个问题:c语言中指针和数组在编译时的区别 例如:int a[10]和int *b,a[5]和b+5 在编译的时候区别是什么
...全文
105 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cg05568256068 2009-04-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lingyin55 的回复:]
C专家编程里解释的很好:

经典的错误:在一个文件定义了数组,却在另外一个文件声明其为指针。代码如下:
/*File name: main.c*/
extern int* array; /*声明指针*/
int main(void)
{
array[0]=1; /*用指针访问数据*/
return 0;
}

/*File name: def.c*/
int array[5]={0}; /*定义的却是数组*/

1。编译器对数组名和指针变量的处理方式
编译器在编译时会产生一个符号表,记录了符号名和它的…
[/Quote]
太谢谢了!
lingyin55 2009-04-22
  • 打赏
  • 举报
回复
C专家编程里解释的很好:

经典的错误:在一个文件定义了数组,却在另外一个文件声明其为指针。代码如下:
/*File name: main.c*/
extern int* array; /*声明指针*/
int main(void)
{
array[0]=1; /*用指针访问数据*/
return 0;
}

/*File name: def.c*/
int array[5]={0}; /*定义的却是数组*/

1。编译器对数组名和指针变量的处理方式
编译器在编译时会产生一个符号表,记录了符号名和它的地址。对于指针变量,这显然很好理解。而数组名就不那么明显了,它仅仅是一个符号而已,何来地址?编译器是这样处理的,它记录了array[0]的地址;这和我们通常的理解也是一样的。
2。带下标形式的数组和指针寻址方式
(1)数组情形
char a[9]="abcdefgh";
...
c=a[i];
在编译期,会在符号表中创建这样一条记录:
name:a address:9980
要获取a[i]的值分两个步骤:
step 1:取得i的值并和9980相加
step 2:在内存地址(9980+i)处取其内容

(2)指针情形
char* p="abcdefgh";
...
c=p[i];
在编译期,会在符号表中创建这样一条记录:
name:p address:4624
要获取p[i]的值分三个步骤:
step 1:在内存地址4624处取其内容,比如说“5081”
step 2:取得i的值并和5081相加
step 3:在内存地址(5081+i)取其内容
jame2001 2009-04-22
  • 打赏
  • 举报
回复
你可以用汇编语言來看编译器如何實作...
影子LEON 2009-04-22
  • 打赏
  • 举报
回复
int a[10]和int *b
如果b=a的话
a[5]则是第六个元素
b+5则是第六个元素的地址
*(b+5)则是第六个元素
jackyjkchen 2009-04-22
  • 打赏
  • 举报
回复
int a[10]和int *b
这两个是有区别的,一个预分配了栈内存空间,一个是未初始化的野指针,没有指向任何合法空间。

a[5]和b+5
这两个区别倒不大,数则也可以用后者定位,指针也可以用前者定位,一些老的C语言教材推荐后者,但是实际上编译效率是一样的

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧