博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
指针与数组
阅读量:6910 次
发布时间:2019-06-27

本文共 1236 字,大约阅读时间需要 4 分钟。

一、什么时候数组和指针是相同的
1、表达式中的数组名(与声明不同)被编译器当作一个指向该数组第一个元素的指针
因此如a[i]这样的访问都被编译器改写或解释为*(a+i)的形式,同样取下标操作符的操作数是可交换的,所以a[3]可以写成3[a],不过通常你不会这样做。
2、下标总是与指针的偏移量相同,下标*sizeof(元素类型)就是偏移数组起始地址的实际字节数。
3、“作为函数参数的数组名”等同于指针,任何传递给函数的数组参数都会被转换成指针,这是基于效率考虑,避免了数组的拷贝。在函数内部,数组参数都将被转换成一个指针,要牢记这一点,因此如:
void
 test(
char
 a[
10
])
{
   printf(
"
%d\n
"
,
sizeof
(a));
}
显然应该打印指针大小4,而非数组大小。另外,注意数组参数的地址跟数组参数第一个元素的地址并不相等,在表达式中两者一致,但是在函数调用中,由于数组参数指针也是临时变量,因此两者的地址是不一样的。
可以通过下列程序观察:
#include 
<
stdio.h
>
#include 
<
stdlib.h
>
void
 test1(
char
 a[])
{
    printf(
"
&a=%x,&(a[0])=%x,&(a[1])=%x\n
"
,
&
a,
&
(a[
0
]),
&
(a[
1
]));
}
void
 test2(
char
 
*
b)
{
    printf(
"
&b=%x,&(b[0])=%x,&(b[1])=%x\n
"
,
&
b,
&
(b[
0
]),
&
(b[
1
])); 
}
int
 main(
int
 argc, 
char
 
*
argv[])
{
  
char
 ga[]
=
"
hello
"
;
  printf(
"
&ga=%x,&(ga[0])=%x,&(ga[1])=%x\n
"
,
&
ga,
&
(ga[
0
]),
&
(ga[
1
])); 
  test1(ga);
  test2(ga);
  system(
"
pause
"
);
  
return
 
0
;
}
二、指针跟数组什么时候不同
1、如果定义了一个数组,在其他文件对它进行声明也必须声明为数组,定义和声明必须匹配,指针也是如此。
2、指针始终是指针,它绝不可以写成数组。可以用下标形式访问指针的时候,一般都是指针作为函数参数时,并且你知道传递给函数的实际是一个数组。
3、数组名是不可改变的左值,因此如
int
 array[
100
],array2[
100
];
array
=
array2;
array++;
array--;
 
都将出错,但是在函数内部:
int
 array2[
100
];
void
 fun(
int
 array[])
{
  array
=
array2;
}
却可以,因为在函数内部array虽然被声明为数组实际上却是指针。
文章转自庄周梦蝶  ,原文发布时间2009-02-17

转载地址:http://xxbcl.baihongyu.com/

你可能感兴趣的文章
ORACLE EXECUTE IMMEDIATE 小结
查看>>
Java项目多数据源配置 (转)
查看>>
JS对象的创建
查看>>
(六)6.16 Neurons Networks linear decoders and its implements
查看>>
USACO 补完(TJ)计划
查看>>
python学习笔记-os模块参数
查看>>
JDBC
查看>>
Redis学习-发布/订阅
查看>>
Unity3D - UGUI的初级应用
查看>>
bootstrap学习笔记
查看>>
iOS返回到指定界面
查看>>
4.02.03
查看>>
XMPP即时通讯(代码实现)
查看>>
winform 计算器二
查看>>
快速开发基于 HTML5 网络拓扑图应用1
查看>>
LUA 表结构的使用
查看>>
动态规划
查看>>
威佐夫博弈
查看>>
前端工程师知识图
查看>>
李俊君保研个人陈述
查看>>