C语言中指针的几点注意

前言

,,,,最近在看《C语言深度剖析》,发现里面的东西还是挺有用的,特别是以前脑海中C语言中一些不清晰的部分作者都一一指出了,对与深入学习C和找工作方面都有帮助。

,,,,今天要记录一些指针方面的东西,包括数组名和数组名的地址,指针数组和数组指针,函数指针的用法。


组名和数组名的地址

,,,,首先看一段代码:

“代码”类# include & lt; stdio.h>int main () {int [5]={0};printf (“sizeof (a): % d \ nsizeof (,): % d \ nsizeof (, [0]): % d \ n", sizeof (a), sizeof (,), sizeof (, [0]));printf (“a: 0 x % \ n&答:0 x % \ n& [0]: 0 x % \ n",,,,,一个[0]);返回1;}


编译运行结果:



感觉还是蛮意外的,因为一和,一个[0]的值是完全一样的,都是数组首元素的地址,而和一个感觉其值应当是一个的地址,运行结果却是和一个的值表示的也是数组首元素的地址。

有一句比较拗口的话,你对数组名取地址当然取到的是数组的地址,而不幸的是C又规定数组名的值就是数组地址。

对于大小,首先它不是函数,它是一个操作符(运营商)简单的说其作用就是返回一个对象或者类型所占的内存字节数。

在很多笔试题中都会考到运算符一个结构体,需要注意内存对其。

还有就是运算符数组名了,要注意数组名在大小的时候不退化为指针,所以大小的是整个数组的大小,5 * 4=20;

还要注意的是当数组名作为函数的参数进行传递的时候,数组就自动退化为同类型的指针。


指针数组和数组指针

首先看下面两句:

“代码”类int * p1 [10];int (* p2) [10], 

这俩一个是指针数组,一个是数组指针,怎么区分的,答案:看优先级。

第一个,<强>[]强的优先级比<强> * 强的优先级大,所以是申明一个数组,这个数组的数据类型是<强> int * 强,其含有10个指向int类型数据的指针,所以这是一个指针数组。

第二个,括号优先级最大,所以是定义一个指针,指针指向的内容是包含10个元素的数组,所以这是一个数组指针,注意,它是一个二级指针。

看一个例子:

“代码”类# include & lt; stdio.h>int main () {int * p1 [10];int (* p2) [10];int=10;int b [2] [10]={0};p1 [1]=,;p2=b;printf (“* p1 [1]: % d \ np2 [0] [0]: % d \ n", * p1 [1], p2 [0] [0]);printf (“% d % d \ n", sizeof (p1), sizeof (p2));返回1;}



理解了指针数组和数组指针的改面,上面的代码也就明了了。


函数指针

函数指针的含义是一个指针变量,其指向的值是一个函数,看下面一个例子。

“代码”类# include & lt; stdio.h>长因子(int n){长结果=1;而(n比;1){结果*=n;n——;}返回结果;}int main(){长(* pf) (int n)=!;长result1=pf(10)编写此表达式;长result2=(* pf) (10);printf (“% d \ n", sizeof (pf));printf (“% ld, % ld \ n", result1,编写此表达式result2);返回1;}

3 - 12行是一个求阶乘的一个函数。

16行声明定义了一个函数指针,指向阶乘函数,注意括号不能省略。

17和18行是调用函数指针的两种方式,效果是一样的。

19行打印函数指针占的内存空间。

水?2/文本/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lsYW5ncXVhbg==/字体/5 a6l5l2t/字形大?400/填充/I0JBQkFCMA==/溶解/70/重力/东南”alt=" C语言中指针的几点注意”>


参考

《C语言深度剖析》

C语言函数指针基础安康;http://blog.jobbole.com/44639/

C语言中指针的几点注意