C语言中数组与指针

     数组是内存空间的一片连续的区域,用于存贮一组相同数据类型元素的集合。

     指针变量中存放的是变量的地址,通过指针取得地址,再通过地址提取数据。

     在大多是C语言书中,都有这样的说法,“数组和指针是相同的”。其实,数组与指针,只能在特定的情况下才是相同的,在大多书情况下,他们并不相同。

     C语言中每个表示变量的符号都代表一个地址,而每个变量的值就是该地址里所存储的内容。

     定义一个字符数组 char a[]="asdfghjkl";现在来访问第i个字符a[i],编译器符号表中具有一个符号,它代表的地址是40200,首先,取得 i 的值,然后把它与40200相加得到地址40200+i,再取地址40200+i 地址的值。内存中的分布如下:

a s d f g

   

40200    40201   40202    40203  40204                                                                                         

Code

      定义一个指针 char *p="asdfghjkl";现在访问第 i 个字符,

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 char *p="asdfghjkl";
 4 int main()
 5 {
 6     int i=3;
 7     printf("&p=%x
",&p);
 8     printf("p=%x
",p);
 9     printf("&p[i]=%x
",&p[i]);
10     system("pause");
11     return 0;
12     } 

 这两种方法都能取得一个字符,但这两种方法非常不一样的,第二种方法其实是指针访问方式和数组访问方式的结合。先在编译器符号表中找到一个符号p,先取得该符号所代表地址里的内容,以该内容作为地址并与偏移量相加,得到字符的地址,取该地址内容便得到字符。

     如果把符号p声明为一个指针 extern char *p;则无论它原来的定义是数组还是指针,都会按第二种方式来访问。但是,只有当符号p原来被定义为指针时,访问才是正确的,如果他原来被定义是数组,这儿却以指针来访问,毫无疑问,必将导致错误的结果。

原文地址:https://www.cnblogs.com/xnwqc/p/4451604.html