一、什么时候数组和指针是相同的
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虽然被声明为数组实际上却是指针。
分享到:
相关推荐
单从字面上来看似乎很难分清它们是什么,我们先来看看指针数组和数组指针的定义。 指针数组:数组类型 *数组名[数组长度]; 例:int *parr[5]; 数组指针:类型名 (*指针名)[数组长度]; 例:int (*parr)[5]; 现在我们...
指针与数组.txt 指针与数组.txt 指针与数组.txt
指针的用法大全,指针与数组,指针详解,收藏的有关指针的文件
指针与数组定义小结 指针与数组定义小结 指针与数组定义小结
指针与C程序效率教学探究(指针与数组效率对比),介绍了指针比数组好的原因
指针与数组 2 指针与数组 一个变量有一个地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。所谓数组的指针就是指数组的起始地址(首地址),数组元素的指针则是数组元素的地址...
实验与指导-数组指针字符串 指针与数组区别
该ppt包含了c语言的指针和数组的一些用法,相信对你有一定的帮助!
c语言利用指针求数组的最大值与最小值,下载资源,数组可扩展。
指针与数组的对比指针与数组的对比指针与数组的对比
c的指针与数组使用说明
数组指针和指针数组的区别 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二...
C语言程序设计课件:7 指针、指针与数组.ppt
指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序设计者就被搞糊涂了。而许多的大 学老师,他们在C语言的教学过程中也错误得给学生讲解:"数组名就是...
指针与数组的关系 其实指针和数组是不同的 入门级问题!
实验7指针与数组参考答案.rar
1 数组及其简单应用 2 指针及其简单应用 3 指针与数组 4 字符串 5 指针数组与命令行参数 6 引用