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

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



数组的定义:

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//通过指针形式访问c
p[2]-------->c//通过数组形式访问c

int arr[10]={1,2,3,4,5,6};
*(arr+6)=7;//通过指针形式将第七个元素赋值为7
arr[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;//将指针数组的值赋值给数组指针的解引用
 



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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值