c语言数组和指针
2018-06-04 11:34
274 查看
版权声明:本文为博主原创文章,注明出处允许转载。 https://blog.csdn.net/MasterJackal/article/details/80565166
由此可见,数组是直接访问地址上的对象,而指针是通过地址上的内容间接的访问内容上的对象;同样数组名是不可修改的,而指针地址上的内容是可以修改的。
就可以通过一下的任何一种方式来访问array[i]:
博客搬家: 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的时候,如不小心把形参中的数组当做数组计算,可想而知结果是错误的。
相关文章推荐
- 读朱兆祺攻破C语言之六---数组、指针
- 第09天C语言(01):指针和数组
- c语言中指针,二维数组,一维数组,指针数组,二级指针,应用
- C语言 第 7 节 如何将字符串指针指向的内容赋值给数组
- C语言指针与数组
- 20170214C语言提升08_指针_01变量及指针及数组
- C语言指针与数组
- C语言学习笔记.指针4--数组指针和指向数组的指针变量(一)
- C语言中,指针字符串与数组字符串的区别
- C语言:返回两个数组中第一个元素的指针,并输出这个值
- C语言之指针数组
- C语言拾遗:数组指针与指针数组
- 【C语言提高33】数组指针类型定义
- C语言多维数组与多级指针
- C语言数组名及指向数组指针的小结
- C语言基础(类型、数组、指针、传参)
- C语言中的指针和数组
- Tips--C语言数组指针
- (C语言)数组与指针的使用
- c语言之指针与数组知识点随笔