您的位置:首页 > 编程语言 > C语言/C++

c语言数组和指针

2018-06-04 11:34 274 查看
版权声明:本文为博主原创文章,注明出处允许转载。 https://blog.csdn.net/MasterJackal/article/details/80565166

博客搬家: https://www.geek-share.com/detail/2689485188.html

在c语言中指针和数组是很容易让人迷糊的概念,到底数组和指针有没有区别呢?答案是肯定的。

1. 数组与指针的区别

① char array[4];
② char *ptr;
表达式①和②一样吗?看看在申明两个表达式时,内存是怎么分配的
表示式①是申明一个含有4个字符类型的元素的数组,表达式②是申明一个字符类型的指针;在内存中的分配情况如下:

从内存分配中,数组分配的内存是用了存放数组中元素的值的,可以直接通过数组的下标来直接访问数组的元素中数据;而在指针的声明中只为该指针分配了空间,并不能直接的用来存放要访问的数据的值,那么指针是如何访问的呢,通过下图来分析:

指针存储的是对象的首地址,然后通过首地址来解引用,间接的访问数据。所以当定义为指针,但却以数组的方式访问引用时,实际上是通过取得指针地址的内容(即指针指向对象的地址),再通过这个地址对进行偏移来获取数组的值。那么是不是所有的指针所指向的对象都必须先进行声明定义呢?一般情况下是这样的,但是有一个是例外的,就是当指针指向的对象是字符串时:

char * p = "1234"
;这样中方式是可行的,但:
char * p = '2'
是不可行的,会出现未定义行为。但是采用这种形式声明定义一个指向字符串的指针时,字符串的内容只允许读,不允许修改,因为此时的字符串常亮被存放在只允许读取的文本段中。
由此可见,数组是直接访问地址上的对象,而指针是通过地址上的内容间接的访问内容上的对象;同样数组名是不可修改的,而指针地址上的内容是可以修改的。

2. 数组什么时候可以用指针代替

c标准对数组和指针何时是相同的做了如下说明
①表达式中的数组名(与声明不同)被编译器当做一个指向该数组第一个元素的指针(表达式中的数组名就是指针)
②下表总是与指针的偏移量相同(c语言把数组下标作为指针的偏移量)
③在函数声明中,数组名被编译器当作指向该数组第一个元素的指针(作为函数参数的数组名等同与指针)
下面举个例子来简要来说明规则①②:

int array[4],*p,i = 1;

就可以通过一下的任何一种方式来访问array[i]:
p = a;p[i];
p = a; *(p+i);
p = a +i; *p;

对于规则③,下面举个例子来说明:

int main(){
int p1[5] = {1,2,3,4};
printf("size of p1 is %ld\n",sizeof(p1));
getp(p1);
geta(p1);
}
void getp(int * p){
printf("size of p is %ld\n",sizeof(p));
}

void geta(int a[]){
printf("size of a is %ld\n",sizeof(a));
}

结果如下图:

这里特别说一下:在计算sizeof的时候,如不小心把形参中的数组当做数组计算,可想而知结果是错误的。

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: