c指针浅谈第二篇(指针与数组的关系)

来源:互联网 发布:sql server2008百度云 编辑:程序博客网 时间:2024/06/05 07:03

一,相关定义

 1、指针的本质是一个与地址相关的复合类型,它的值是数据存放的位置(地址);数组的本质则是一系列的变量。

 2、数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。指针可以随时指向任意类型的内存块,它的特征是可变,所以我们常用指针来操作动态内存。

   3、当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针

二,具体的实例分析

1.听说char a[]char *a是一致的,是不是这样呢?

分析指针和数组存在着一些本质的区别。当然,在某种情况下,比如数组作为函数的参数进行传递时,由于该数组自动退化为同类型的指针,所以在函数内部,作为函数参数传递进来的指针与数组确实具有一定的一致性,但这只是一种比较特殊的情况而已,在本质上,两者是有区别的。
例如:char a[]="Hi,ping"
char  *p="Hi,ping"
数组a在内存中占8个字节,指针p侧需要四个字节来存放其地址,它指向了连续8个字节的空间的字符串。另外,对于a[1]和p[1]返回字符都是i,但是编译器产生的执行代码却不一致,对于a[1]来讲,执行代码从a数组开始,偏移二个位置,然后取出其中的字符,对于p[1]来说,执行代码从p开始取出一个地址+2,然后取相应内存中的东西。

2.数组指针和指针数组

分析:

数组指针:指向数组的指针,既一个指针指向的是一个数组,常用于多维数组,例如:int (*p)[3] p指向的是一个数组

指针数组:就是数组里面存的是指针,常用于字符串数组,例如:char *p[3];

3.指向指针的指针

分析:我们可以通过二维指针来做很多事情,函数传参用二级指针,二维数组用在动态的二维数组也是一个不错的选择

直接上例子:
 这个程序假定行空间和列空间,列空间指的是要指的字符串,行空间就是指的字符串的个数
Char **p=NULL;
Char *p1=NULL;
Int sum=0;
Int cursum=0;
If(cursum>=sum)//当行空间不够用的时候
{
Sum+=50; //每次申请50行
P=realloc(p,sum*(char *));
If(p==NULL)
Return ;
}
P[cursum++]=p1;//假设p1是要指向的字符串

 



0 0
原创粉丝点击