指针和数组的区别

来源:互联网 发布:淘宝限时打折 编辑:程序博客网 时间:2024/05/29 08:20
1、指针和数组是两个不同的概念,指针是一个特殊的变量,改变量的值是一个内存地址。我们可以通过这个地址来获取这个地址中的内容。系统只给这个变量分配四个字节的空间。而这个指针指向的内容却不一定是四个字节。可能是一个或多个。而数组是一组相同数据类型的数据的组合。她在运行时获取的内存与数组的大小和单个数据占用的空间有关。之所以把他们混为一谈。是因为他们在有的时候可以互换使用。但是他们绝对是不同的两个概念。
指针是C语言中最难正确理解和使用的部分之一(几乎所有的程序员都这么说)。可能只有声明的语法比他更麻烦了。然后他们也是C语言中最重要的部分之一。专业C程序员必须熟练掌握malloc()函数,并且学会用指针操纵匿名内存。
我们从变量的声明和定义开始。简单来说,定义就是告诉编译器,这里实实在在的存在一个变量,必须要给他分配内存空间。而声明则是告诉编译器这个变量在其他的地方分配内存即可。我只是告诉你我要在这里使用这个变量。所以变量的对象只能有一个定义,却可以有多个声明。
那么定义了数组或指针以后,如何去访问呢?他们的访问过程也存在着不同。访问数组是根据数组名作为首地址,取下标后首地址+下标获取变量的位置,然后就可以获取需要的值。访问指针先指针指针变量所指向的地址,然后加上偏移量,方可取得数值。虽然他们都是首地址+偏移量。但是这两个首地址也存在着不同。数组的首地址是个常量。是不允许改变的。而指针变量由于是个变量,可以进行改变。如下列程序:
 char p[] = "breadfruit";
    char *t;
    t = p;
    printf("%s\n", t);
    t = p + 2;
    printf("%s\n", t);
    
运行结果是:
breadfruit
eadfruit
我们还需要注意“地址p”和“地址P指向的内容的区别”。如一个简单的例子:
int *p;
*p = 4;
其中p代表一个指针变量。他的值是一个地址,这个地址指向的值为4(或者说地址中存储的内容为4。)。这些区别可以通过最常用的赋值符“=”来说明。任何变量对应的都是一个地址。也可以说是一个指针。她在作为左值。而常量4或是变量均可作为右值。但是左值只能是可以修改的变量。二不允许是常量。
数组和指针都能在他们的定义中使用字符串常量来进行初始化(只有在对字符串常量才是如此。不要妄想对其他类型变量也如此)。但是底层实现却不相同。定义指针时,编译器并不为指针所指向的对象分配空间。他只是分配指针本身的空间。除非在定义时同时赋给指针一个字符串常量进行初始化(因为是常量,所以不要妄想对其进行改变。否则会出现段错误)。与指针相反,有字符串初始化的数组是可以修改的。借用上面的程序:
    char p[] = "breadfruit";
    *(p + 2) = ‘m’;
    printf("%s\n", t);
运行结果:brmadfruit
如果改成:
    char *p = "breadfruit";  
    *(p + 2) = ‘m’;
    printf("%s\n", t);
运行结果:segmentation fault(段错误).

所以在定义的时候,尽量使用字符数组的形式,而不要使用指针的形式,(一般形式)

注:部分内容节选自《C专家编程》,结合自己的实际写的此文。希望大家多多批评指正!


原创粉丝点击