C语言之指针、数组和函数

C语言之指针、数组和函数,第1张

C语言之指针、数组和函数,第2张

基本解释
1。指针的本质是与地址相关的复合类型,其值是存储数据的位置(地址);数组的本质是一系列变量。
2。数组名对应(而不是指向)一块内存,它的地址和容量在生命周期内保持不变,只有数组的内容可以改变。指针可以在任何时候指向任何类型的内存块,它的特点是“易变”,所以我们经常使用指针来操作动态内存。
3。当一个数组作为一个函数的参数传递时,该数组会自动退化为同类型的指针。
问题:指针和数组
听说char a[]和char *a一致是吗?
答案及解析:
指针和数组有一些本质的区别。当然,在某些情况下,比如当数组作为函数的参数传递时,数组会自动退化为同类型的指针,所以作为函数参数传递的指针确实与数组有一定的一致性,但这只是特例。本质上,两者是不同的。请看下面的例子:
char a[] =“嗨,猪!”;
char *p = "嗨,猪!";
以上两个变量的内存布局如下:
数组A需要在内存中占用8个字节的空,这个内存区域用名称A来标记,指针P需要4个字节的空来存储地址,这4个字节用名称P来标记,存储的地址可以指向几乎任何地方,也可以什么都不指向,就是空指针。目前这个p指向某处连续的8个字节,也就是字符串“嗨,猪!”。
另外,比如对于a[2]和p[2],两者都返回字符‘I’,但是编译器生成的执行代码不同。对于a[2],执行代码从A的位置开始,向后移动2个字节,然后取出其中的字符。对于p[2],执行代码是从p的位置取出一个地址,加2,然后取出对应内存中的字符。
问题:数组指针
为什么在某些情况下我们需要定义指向数组的指针而不是数组元素?怎么定义?
回答与分析:
指针是用来保存一个元素的地址的,以便利用指针的独特优势。然后,当元素需要是数组时,很自然地使用指向数组的指针,比如高维需要动态生成时的多维数组。
定义的示例如下:int (*pElement)[2]。
下面是一个例子:
Intarray [2] = {{1,2,3},{4,5,6 } };
int(* pa)[3];//定义一个指向数组的指针
pa = & array[0];//'& '符号可以反映pa的含义,表示它是一个数组的指针
printf ("%d ",(* pa)[0]);//将打印数组[0][0],即1
pa++;//猜猜,它指向谁?数组[1]?没错!
printf ("%d ",(* pa)[0]);//数组[1][0],即4
将被打印。上面的例子充分说明了数组指针的定义和使用,指针指向整个数组。
应该注意的是,正如我们在第四篇文章中讨论的,指针的步进指的是它所指向的对象的大小。因此,pa++会将整个数组向后移动一个数组的大小,而不仅仅是向后移动一个数组元素的大小。
问题:指针数组
有如下定义:
struct ut _ test _ struct * PTO[2][max _ num];
请分析这个定义的含义,并尝试解释这样一个定义可能带来的好处?
回答与分析:
前面讲了数组指针,现在提到指针数组。这两种形式非常相似。那么,我们如何区分两者的定义呢?分析如下:
数组指针是:指向一个数组的指针,比如int (*pA)[5]。
指针数组是:指针的数组,比如int *pA[5]。
至于上述指针数组的好处,大致有以下两个常见的原因:
a)、每个指针的内容可以根据需要动态生成,避免了空的浪费。
b)每个指针排列成一个数组,非常方便索引。
在实际编程中,指针数组的选择大多是为了获得以上两个好处。
问题:指针对指针
在制作文本处理程序时,有这样一个问题:什么样的数据结构适合按行存储文本?
回答与分析:
首先我们来分析一下文本的特点。这篇课文的主要特点是非常生动。一行文本的字符数或多或少是不确定的,整个文本的文本行数也是不确定的。这个特性决定了使用固定的二维数组存储文本行必然有很多局限性,缺乏灵活性。在这种场合,使用指针对指针有很大的好处。
现实中我们尝试用动态二维数组(本质上是指针对指针)来解决这个问题:
图标是指针数组。所谓动态,就是水平(每行文本对应的字符数)和垂直(整个文本对应的行数)两个方向都可以改变。
就水平方向而言,由于指针的灵活性,可以指向任意大小的字符数组,从而实现水平动态。
纵向上,可以动态生成和扩展所需指针数组的大小。
下面的代码演示了此动态数组的用法:
/用于从文件中读取以“[2]”结尾的字符串的函数
extern char * getline(file * pfile);
FILE * pFile;
char * * PP text = NULL;//二维动态数组指针
char * pcurrtext = null;//指向当前输入字符串的指针
ulongulcurrlines = 0;
ULONG ulAllocedLines = 0;
while(p = getline(pfile))
{
if(ul currines > = ulAllocedLines)
{
/*当前垂直空不够,通过realloc
ulAllocedLines+= 50;//一次展开50行。
ppText = realloc (ppText,ulAllocedLines *(char *));
if(NULL = = PP text)
{
return;//内存分配失败,返回
}
}
PP text[ul currines ++]= p;//水平“展开”,指向不定长字符串
}

[3]

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C语言之指针、数组和函数

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情