|
西交《程序设计基础》拓展资源(六)
数组和指针的区别
前言:指针和数组是《程序设计》课程中很重要的两个概念,两者有明显区别,但又有联系,很容易混淆。今天的拓展资源就和同学们一起来对数组与指针进行一个比较深入的区别。一、很多C语言编程的人是知道的,在使用数组和指针的时候,有时候知道怎么用,但是他们之间有何区别,你可能说不出所以然来,据此,我专门去书店查了写相关的资料,才逐渐有了些依据,如果有意想,你可以去找一下《C语言解惑》这本书,下面将就相关总结一下:
数组名可以当作一个指针来用,数组名可以用*取其中的值,指针也可以用[]解引用,但它们还是有一些区别的,下面有3个:
数组名不可以作为左值,关于这一点,可以将数组名理解为指针常量。
int a[10],*b;
b是一个指针型变量,a是一个数组。
b是左值,可以存在b=a;
a不是左值,不能出现在"="左边。
a相当于一个常量,类型为数组。
对数组名进行sizeof运算时,结果是整个数组占用空间的大小,而sizeof(指针)得到的值是编译器分配给指针(也就是一个地址)的内存空间。(对于比较老的编译器如TC,指针所占字节数通常是2,对于现在常见的编译器一般是4)。
对数组名作&(取地址)运算,得到的还是数组第一个元素的地址,对指针取地址时得到的结果是指针所在的地址,也就是指向这个指针的指针。
运算
一维数组和指针在"*"运算是都有访存操作。
多维数组在"*"运算只是类型改变,没有具体操作。
指针变量在"*"运算时先访存,获得地址,再取地址对应内存中的值。
指针变量在"&"运算时,得到指针变量的地址。
数组在"&"运算只是类型改变,没有具体操作。二、首先对于编译器而言,一个数组是一个地址,一个指针是一个地址的地址。
数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。
例如:
void main(void)
{
int a[10];
a ++;//error, a is left value,but can't be changed.
}指针可以随时指向任意类型的内存块,远比数组灵活,但也更危险。 下表是指针和数组一个简单的比较:
1、指针和数组都可以在初始化的时候赋予字符串常量。尽管看上去一样,底层机制却不同。
指针在定义的时候,编译器并不会为指针所指向的对象分配内存空间,它只是分配指针变量的空间。除非以一个字符串常量对其进行初始化。下面的定义创建了一个字符串常量(为其分配了内存空间)
char *p = "abcd";
在ANSI C中,初始化指针时所指向的字符串被定义为只读,如果想通过指针修改字符串的时候,会产生未定义的行为。
数组也可以用字符串常量进行初始化,但是其内容可以被修改。2、内容的复制和比较
不能对数组进行字节复制和比较,对于两个数组a,b,不能用b=a进行复制,而应当使用标准库函数strcpy()。也不能使用if(b==a)进行比较,应当使用strcmp()。
而对于指针p,如果要想将数组a中的内容复制,要先申请一块内存区域,然后使用strcpy()进行拷贝。
void main(void )
{ char a[] ="hello";
char b[10];
strcpy(b,a); // can't use b=a;
if(strcmp(b,a) == 0);//can't use if(b==a)
char *p = NULL;
p = (char *)malloc(sizeof(char *)*(strlen(a)+1);
strcpy(p, a);
if(strcmp(b,a) == 0);
}3、计算内存容量
用运算符sizeof()可以计算出数组的容量(字节数)。如下例
char a[] = "abcdef";
char *p = a;
sizeof(a) = 7;
sizeof(p) = 4;//sizeof(p) equal to sizeof(char *) =4
注意当数组名作为函数参数进行传递时,该数组自动退化该类型的指针,如下例:
void TEST(char a[100])
{
cout<<sizeof(a)<<endl;// in this place, sizeof(a) is equal to sizeof(char *) = 4
}本内容由易百网整理发布
网址 www.openhelp100.com
联系方式QQ 515224986
|
|