189 8069 5689

C语言中指针的几点注意-创新互联

前言

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

目前创新互联建站已为千余家的企业提供了网站建设、域名、网页空间、网站托管、企业网站设计、广德网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

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

组名和数组名的地址

    首先看一段代码:

#include  int main() { 	int a[5]={0}; 	printf("sizeof(a):%d\nsizeof(&a):%d\nsizeof(&a[0]):%d\n",sizeof(a),sizeof(&a),sizeof(&a[0])); 	printf("a:0x%x\n&a:0x%x\n&a[0]:0x%x\n",a,&a,&a[0]); 	return 1; }


编译运行结果:

C语言中指针的几点注意

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

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

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

在很多笔试题中都会考到sizeof一个struct,需要注意内存对其。

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

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


指针数组和数组指针

首先看下面两句:

	int *p1[10]; 	int (*p2)[10];

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

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

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

看一个例子:

#include  int main() { 	int *p1[10]; 	int (*p2)[10]; 	 	int a = 10; 	int b[2][10]={0}; 	p1[1] = &a; 	p2 = b; 	printf("*p1[1]:%d\np2[0][0]:%d\n",*p1[1],p2[0][0]); 	printf("%d,%d\n",sizeof(p1),sizeof(p2)); 	return 1; }

C语言中指针的几点注意

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

函数指针

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

#include   long factorial(int n)  {      long result = 1;    while (n > 1)      {          result *= n;          n--;      }      return result;  }  int main() { 	long (*pf)(int n) = factorial; 	long result1 = pf(10); 	long result2 = (*pf)(10); 	printf("%d\n",sizeof(pf)); 	printf("%ld,%ld\n",result1,result2); 	return 1; }

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

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

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

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

C语言中指针的几点注意C语言中指针的几点注意

参考

《C语言深度剖析》

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

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前文章:C语言中指针的几点注意-创新互联
本文URL:http://cdxtjz.cn/article/ddcdjj.html

其他资讯