好朋友?陌生人?-------指针与数组

来源:互联网 发布:淘宝店铺过户条件 编辑:程序博客网 时间:2024/06/05 15:38

数组:用来保存一组相同类型的元素的集合,通常用于固定数目且类型相同指针:专门用来保存一个变量的地址,即指针就是地址,通常用于动态数据结构



数组的定义:

int arr[5]={1,2,3,4,5};
指针的定义:

int a=0;

int *p=&a;

数组:一但定义后,编译器会为它分配一段连续的存储单元,数目开始时就会直接或间接的被固定,看起来

          虽然比较整洁,但写法比较死板,同样也比较浪费空间。

指针:指针存放的是一个地址值,指向某个单元,可以通过该指针来索引此单元,在编程和思路构建过程中

          有很大的灵活性。

类似的,

指针数组:即数组元素全部为指针的数组,数组中的每个元素都是指针,本质为数组

数组指针:即指向数组首元素地址的指针,本质为指针

指针数组的定义:

int *arr[5];

数组指针的定义:

int (*p)[5];



二维数组和指针数组:

二维数组:如int arr[10][10]只要定义了一个二维数组,无论赋不赋值,系统都会给他分配相应空间,而且

该空间一定是连续的。其每个元素表示一个字符。我们可以通过制定下标对其元素进行修改。

指针数组如int *arr[5] 系统至少会分配5个连续的空间用来存储5个元素,表示arr是一个5个元素的

数组,每个元素是一个指向整型数据的一个指针。

如果我做这样的定义:

char a[3][8]={"gain","much","strong"};                                         

 char *n[3]{"gain","much","strong"};

他们在内存的存储方式分别如右图所示,可见,系统给数组a分配了

3×8的空间,而给指针n分配的空间则取决于具体字符串的长度。

此外,系统分配给a的空间是连续的,而给n分配的空间则不一定连续。

由此可见,相比于比二维字符数组,数组有明显的优点:一是指针数组中每个元素所指的字符串不必限制

在相同的字符长度;二是访问指针数组中的一个元素是用指针间接进行的,效率比下标方式要高。 但是二

维字符数组却可以通过下标很方便的修改某一元素的值,而指针数组却无法这么做。



二维数组和数组指针:

例如:{int a[4][5]; int (*p)[5]=a;}这里a是个二维数组的数组名,相当于一个二级指针常量;

p是一个指针变量,它指向包含5个int元素的一维数组,此时p的增量以它所指向的一维数组长度为单位;

*p+i是二维数组a[0][ i ] 的地址;

*(p+2)+3表示a[2][3]地址(第一行为0行,第一列为0列),*(*(p+2)+3)表示a[2][3]的值。


指针和数组的联系:

char *p="abcdef";*(p+2)----->c//通过指针形式访问cp[2]-------->c//通过数组形式访问cint arr[10]={1,2,3,4,5,6};*(arr+6)=7;//通过指针形式将第七个元素赋值为7arr[6]=7;//通过指针形式
定义成数组,声明成指针------>错误

定义成指针,声明成数组------->可以用*(char**) 或(char*)*(int*)方式实现

add.c
[cpp] view plain co
  1. char *a="abcdef";
  1. test.c  
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
  1. #include <stdio.h>  
  2.   
  3. extern char a[];  
  4. extern print();  
  5.   
  6. int main()  
  7. {  
  8.                 print();  
  9.                 printf( "%p\n", a);  
  10.                 printf( "%s\n", a);  
  11.                 printf( "%s\n", *(char **)a);  
  12.                 printf( "%s\n", (char *)*(int *)a);  
  13.                 return 0;  
  14. }  

可以用以下方式进行进一步说明:

int a=10;int *arr[10];//指针数组----存放指针的数组int (*ptr)[10];//数组指针----指向数组的指针int *p=&a;//一级指针int **q=&p;//二级指针int (*ptr)[10]=&arr;//将指针数组首元素的地址赋值给数组指针int *(*ptr)[10]=*arr;//将指针数组的值赋值给数组指针的解引用



个人能力有限,如有问题,请帮忙提出!


1 0
原创粉丝点击