C语言和C的指针学习总结

时间:2024.3.15

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

基本解释

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

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

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

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

答案与分析:

指针和数组存在着一些本质的区别。当然,在某种情况下,比如数组作为函数的参数进行传递时,由于该数组自动退化为同类型的指针,所以在函数内部,作为函数参数传递进来的指针与数组确实具有一定的一致性,但这只是一种比较特殊的情况而已,在本质上,两者是有区别的。请看以下的例子:

char a[] = "Hi, pig!";

char *p = "Hi, pig!";

上述两个变量的内存布局分别如下:

数组a需要在内存中占用8个字节的空间,这段内存区通过名字a来标志。指针p则需要4个字节的空间来存放地址,这4个字节用名字p来标志。其中存放的地址几乎可以指向任何地方,也可以哪里都不指,即空指针。目前这个p指向某地连续的8个字节,即字符串“Hi, pig!”。

另外,例如:对于a[2]和p[2],二者都返回字符‘i’,但是编译器产生的执行代码却不一样。对于a[2],执行代码是从a的位置开始,向后移 动2两个字节,然后取出其中的字符。对于p[2],执行代码是从p的位置取出一个地址,在其上加2,然后取出对应内存中的字符。

问题:数组指针

为什么在有些时候我们需要定义指向数组而不是指向数组元素的指针?如何定义?

答案与分析:

使用指针,目的是用来保存某个元素的地址,从而来利用指针独有的优点,那么在元素需要是数组的情况下,就理所当然要用到指向数组的指针,比如在高维需要动态生成情况下的多维数组。

定义例子如下: int (*pElement)[2]。

下面是一个例子:

int array[2][3] = {{1,2,3},{4,5,6}};

int (*pa)[3]; //定义一个指向数组的指针

pa = &array[0]; // '&'符号能够体现pa的含义,表示是指向数组的指针 printf ("%d", (*pa)[0]); //将打印array[0][0],即1

pa++; // 猜一猜,它指向谁?array[1]?对了!

printf ("%d", (*pa)[0]); // 将打印array[1][0],即4

上述这个例子充分说明了数组指针—一种指向整个数组的指针的定义和使用。 需要说明的是,按照我们在第四篇讨论过的,指针的步进是参照其所指对象的大小的,因此,pa++将整个向后移 动一个数组的尺寸,而不是仅仅向后移 动一个数组元素的尺寸。

问题:指针数组

有如下定义:

struct UT_TEST_STRUCT *pTo[2][MAX_NUM];

请分析这个定义的意义,并尝试说明这样的定义可能有哪些好处? 答案与分析:

前面我们谈了数组指针,现在又提到了指针数组,两者形式很相似,那么,如何区分两者的定义呢?分析如下:

数组指针是:指向数组的指针,比如 int (*pA)[5]。

指针数组是:指针构成的数组,比如int *pA[5]。

至于上述指针数组的好处,大致有如下两个很普遍的原因:

a)、各个指针内容可以按需要动态生成,避免了空间浪费。

b)、各个指针呈数组形式排列,索引起来非常方便。

在实际编程中,选择使用指针数组大多都是想要获得如上两个好处。 问题:指向指针的指针

在做一个文本处理程序的时候,有这样一个问题:什么样的数据结构适合于按行存储文本?

答案与分析:

首先,我们来分析文本的特点,文本的主要特征是具有很强的动态性,一行文本的字符个数或多或少不确定,整个文本所拥有的文本行数也是不确定的。这样的特征决定了用固定的二维数组存放文本行必然限制多多,缺乏灵活性。这种场合,使用指向指针的指针有很大的优越性。

现实中我们尝试用动态二维数组(本质就是指向指针的指针)来解决此问题: 图示是一个指针数组。所谓动态性指横向(对应每行文本的字符个数)和纵向(对应整个文本的行数)两个方向都可以变化。

就横向而言,因为指针的灵活性,它可以指向随意大小的字符数组,实现了横向动态性。

就竖向而言,可以动态生成及扩展需要的指针数组的大小。

下面的代码演示了这种动态数组的用途:

// 用于从文件中读取以 '\0'结尾的字符串的函数

extern char *getline(FILE *pFile);

FILE *pFile;

char **ppText = NULL; // 二维动态数组指针

char *pCurrText = NULL; // 指向当前输入字符串的指针

ULONG ulCurrLines = 0;

ULONG ulAllocedLines = 0;

while (p = getline(pFile))

{

if (ulCurrLines >= ulAllocedLines)

{

// * 当前竖向空间已经不够了,通过realloc对其进行扩展。

ulAllocedLines += 50; // 每次扩展50行。

ppText = realloc (ppText, ulAllocedLines * (char *));

if (NULL == ppText)

{

return; // 内存分配失败,返回

}

}

ppText[ulCurrLines++] = p; // 横向“扩展”,指向不定长字符串 }

问题:指针数组与数组指针与指向指针的指针

指针和数组分别有如下的特征:

指针:动态分配,初始空间小

数组:索引方便,初始空间大

下面使用高维数组来说明指针数组、数组指针、指向指针的指针各自的适合场合。

多维静态数组:各维均确定,适用于整体空间需求不大的场合,此结构可方便索引,例a[10][40]。

数组指针:低维确定,高维需要动态生成的场合,例a[x][40]。

指针数组:高维确定,低维需要动态生成的场合,例a[10][y]。 指向指针的指针:高、低维均需要动态生成的场合,例a[x][y]。 问题:数组名相关问题

假设有一个整数数组a,a和&a的区别是什么?

答案与分析:

a == &a == &a[0],数组名a不占用存储空间。需要引用数组(非字符串)首地址的地方,我一般使用&a[0],使用a容易和指针混淆,使用&a容易和非指针变量混淆。

区别在于二者的类型。对数组a的直接引用将产生一个指向数组第一个元素的指针,而&a的结果则产生一个指向全部数组的指针。例如:

int a[2] = {1, 2};

int *p = 0;

p = a; /* p指向a[0]所在的地方 */

x = *p; /* x = a[0] = 1*/

p = &a; /* 编译器会提示你错误,*/

/*显示整数指针与整数数组指针不一样 */

问题:函数指针与指针函数

请问:如下定义是什么意思:

int *pF1();

int (*pF2)();

答案与分析:

首先清楚它们的定义:

指针函数,返回一个指针的函数。

函数指针,指向一个函数的指针。

可知:

pF1是一个指针函数,它返回一个指向int型数据的指针。

pF2是一个函数指针,它指向一个参数为空的函数,这个函数返回一个整数。


第二篇:C语言学习总结


学习总结

暑假即将来临,很开心,但也意味着C语言的学习即将到了尾声。谈及C语言,我想凡是学过它的朋友都有这样一种感觉,那就是“让我欢喜让我忧。”欢喜的是,C语言功能非常强大、应用广泛,一旦掌握了后,你就可以理直气壮地对他人说“我是电脑高手!”,而且以后若是再自学其他语言就显得轻而易举了。忧虑的是,C语言犹如“少林武功”一般博大精深,太难学了。

其实怎么说呢,学习它的时间说长不长,说短也不短了。可是对于它,我也只能说还是处于一知半解的状态下。说不懂吧,你让我拿着书自己也能写出程序来,说不懂呢,就是相对于难一点的程序我就不行了。

不过就算如此也还是有不少收获的。首先,老师让我们时常的敲程序,一开始不明白,后来慢慢发现敲程序也许是最笨的方法但也是进步最快的方法。敲程序的过程就是积累经验的时候,而自己写程序才是真正把所学为所用的时候,可以说只有你做一个大点的程序写出来才能真正是说明你学到了东西,你会用所学的东西,要不然就算你学的再多,不会用也没用啊。其次,在看它敲它的过程中,也从中了解了它的规则是什么、有什么用、怎么实现等,这样自己编起程序来也更得心应手了。最后,也养成了良好的编程习惯。例如编写程序时用缩进的方式、写注释、程序写到一定的阶段时要做一下测试等。这些工作可以帮我们在调试程序时有很大的帮助。程序代码实现后,错误是难免的,所以也要锻炼自己的调试查错能力,而良好的编程习惯

可以使我们在调试时减小工作量和提高调试效率,也有助于形成自己的编程风格。

说了很多学到的,当然也有欠缺的地方。比如,书,我很少看,只有敲程序,或者编程序的时候我才会看。敲程序呢,坚持的时间也不是很持久,只有想的时候和上课的时候才回敲。

也许C语言就这样结束了,但是我想以后用到它的地方还很多,所以我想还是自己坚持学下去,自己好好的看书,慢慢的研究学习,把自己不足的地方,努力的补全。

更多相关推荐:
新员工学习总结范文

20xx年x月x日进入**公司至今已近两周时间,通过这段时间的工作和学习,已经适应了新的工作环境,了解了公司的发展历史及企业文化、认清了公司的组织结构及配置,熟识了大部分的同事,掌握了公司的大部分产品,了解了自…

工商管理个人学习总结范文

为提高自身的管理专业技能,培养创新经营和现代管理意识,促使在工作中进一步更新观念、理清思路。我从20xx年x月开始参加了杭州年代学校开设的国际工商管理班的学习。在一年时间里,通过到杭州面授和课后的温习与自学,…

国际工商管理个人学习总结范文

为提高自身的管理专业技能,培养创新经营和现代管理意识,促使在工作中进一步更新观念、理清思路。我从20xx年x月开始参加了杭州年代学校开设的国际工商管理班的学习。在一年时间里,通过到杭州面授和课后的温习与自学,…

大学生个人学期学习总结范文

在短短的时间里一个学期很快就过去了,大学生活改变了我很多东西,包括我的生活方式和学习方式,当然相比以前是进步了很多。当然,作为新世纪大学生也已经根深在自己的脑子里。对于过去的一个学期里,自己总的表现还算不错,下…

大学学习总结范文

有人说:平凡的大学生有着相同的平凡,而不平凡的大学生会有不平凡的辉煌。开始我选择我不平凡的我,但我最后却选择平凡的我。因为我发现我是有限,当我选择的东西,它却不选择我。来到大学沃有好多第一次,但结果我都失败了。…

大学生学习总结范文

个人总结——李霞过了一个学期,我在系领导和辅导员的关怀、指导下,在同学们的帮助下,学习上迈出了可喜的一步。在这新学期开始之时,我把上学期的学习情况总结一下,一来向领导和老师作一汇报,再者也有利于以后的学习。转眼…

大三上学期个人学习总结范文

时光流转,一晃大三上学期马上就要过去了。这是最不平凡的一学期,鲜花伴着汗水,一点一滴,无不倾注着我对于它的默默付出。同时,这又是一个人生的十字路口,如果说大一大二我们是刚出生的蚕宝宝,一切都是新奇的,凡事都跃跃…

20xx大学学习总结范文

20xx大学学习总结范文总结一大学学习总结范文转眼间我已经进入了大三在二年多的学习生活中有酸甜苦辣有欢笑和泪水有成功和挫折有人总结在任何一个学校平庸的大学生是相似的不平庸的大学生各有各的辉煌我们不能满足于平庸应...

大学学习总结范文

大学学习总结范文从中学到大学是人生的重大转折大学生活的重要特点表现在生活上要自理管理上要自治思想上要自我教育学习上要求高度自觉尤其是学习的内容方法和要求上比起中学的学习发生了很大的变化要想真正学到知识和本领除了...

大学生学习总结范文

大学生学习总结范文来源58com发布时间20xx0316大学生学习总结范文学期结束了半年来我在系领导和辅导员的关怀指导下在同学们的帮助下学习上迈出了可喜的一步在这新学期开始之时我把上学期的学习情况总结一下一来向...

政治理论学习总结范文

政治理论学习总结范文以下是由本站推荐的政治理论学习总结一后勤系统的干部职工主要学习了xx关于社会主义荣辱观的重要讲话通过学习提高认识同志们认为xx的讲话对八荣八耻的概括精辟阐明了社会主义荣辱观的重要内容体现了爱...

个人学习总结范文

个人学习总结为提高自身的知识水平,促使在工作中进一步更新观念、理清思路。我从20xx年春季开始参加了西南财经学院的专升本函授学习。在前一年时间里,通过到南宁面授和课后的温习与自学,先后学习了许多专业知识课程,掌…

学习总结的范文(13篇)