`
897371388
  • 浏览: 529679 次
文章分类
社区版块
存档分类
最新评论

C语言中指针的几点注意

 
阅读更多

前言

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

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


组名和数组名的地址

首先看一段代码:

#include <stdio.h>
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;
}


编译运行结果:



感觉还是蛮意外的,因为 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 <stdio.h>
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;
}



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


函数指针

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

#include <stdio.h>

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语言函数指针基础 -http://blog.jobbole.com/44639/

分享到:
评论

相关推荐

    C语言指针学习经验总结浅谈

    这篇C语言指针学习经验总结主要是我入职以来学习C指针过程中的点滴记录。文档里面就不重复书上说得很清楚的概念性东西,只把一些说得不清楚或理解起来比较费解的东西做一下讲解,希望能达到以下三个目的 1.通过写...

    C语言常用基础知识点.zip

    c语言基础 C语言包含的数据类型广泛,不仅...C语言中的运算符包含以下几个类型:算术运算符、关系运算符、逻辑运算符、位操作运算符、赋值运算符、条件运算符、逗号运算符、指针运算符、求字节数运算符和特殊运算符。

    C语言进阶 作者 Wrestle.Wu

    第2~8章对预处理、选择结构和循环结构的程序设计、数组、指针、数据结构、函数和文件等知识点的核心问题和注意事项进行了讲解;第9章介绍了调试和异常处理的方法及注意事项;第10章对C语言中的若干容易让开发者误解...

    C语言进阶-牟海军.pdf

    第2~8章对预处理、选择结构和循环结构的程序设计、数组、指针、数据结构、函数和文件等知识点的核心问题和注意事项进行了讲解;第9章介绍了调试和异常处理的方法及注意事项;第10章对C语言中的若干容易让开发者误解...

    C语言中二维数组指针的简要说明

    C语言中,指针是一个复杂但又灵活多变的知识点,我们知道,在一维数组中,对于一个数组a[],*a,a,&a,都表示a的首地址,但如果与二维数组混合使用,就显得更为复杂了。例如对于一个二维数组 a[2][4]={{1,2.3},{4...

    c语言从初学到精通(电子工业)光盘源码.rar

     本书的特点是不仅详细介绍了C语言中各个概念,而且在每个知识点后都配套有实例讲解,详细描述C语言中各个概念的实际应用及注意点,非常实用,方便读者模拟实践。本书适合没有编程基础的C语言初学者;正在学习C语言...

    C语言程序设计标准教程

    应注意文件指针和文件内部的位置指针不是一回事。文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的。文件内部的位置指针用以指示文件内部的当前读写位置,每读写一次,该指针...

    C语言进阶:重点、难点与疑点解析 高清(带目录)PDF

    第2-8章对预处理、选择结构和循环结构的程序设计、数组、指针、数据结构、函数和文件等知识点的核心问题和注意事项进行了讲解;第9章介绍了调试和异常处理的方法及注意事项;第10章对C语言中的若干容易让开发者误解...

    C语言中函数指针与软件设计经验总结

    函数指针与软件设计 记得刚开始工作时,一位高手告诉我,说,longjmp和setjmp玩得不熟,就不要自称为C语言高手。当时我半信半疑,为了让自己向高手方向迈进,还是花了一点时间去学习longjmp和setjmp的用法。后来明白...

    C语言入门经典(第4版)--源代码及课后练习答案

    8.5.2 从函数中返回指针值 318 8.5.3 在函数中递增指针 322 8.6 小结 322 8.7 习题 323 第9章 函数再探 325 9.1 函数指针 325 9.1.1 声明函数指针 325 9.1.2 通过函数指针调用函数 326 9.1.3 函数指针数组 ...

    《你必须知道的495个C语言问题》

    难道在C语言中结构不能包含指向自己的指针吗? 7  1.15 如何定义一对相互引用的结构? 9 1.16 Struct{ } x1;和typedef struct{ } x2; 这两个声明有什么区别? 10 1.17 “typedef int(*funcptr)();”是什么...

    深入理解C语言 static、extern与指针函数

    但我们需要注意一下几点: •虽然static修饰变量的生存期很长,但它始终是局部变量,不能在其他函数中使用•static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通...

    你必须知道的495个C语言问题

    难道在C语言中结构不能包含指向自己的指针吗? 1.15 如何定义一对相互引用的结构? 1.16 Struct{ }x1;和typedefstruct{ }x2;这两个声明有什么区别? 1.17 “typedefint(*funcptr)();”是什么意思? const...

    分享C语言学习的几点建议

    初学C语言的朋友应该首先了解C语言关键的核心概念(结构化、三个执行流程、优先级、指针、文件、共用体、函数、作用域、重载等 ),只有弄明白了这些才能在今后的学习中游刃有余的把握C语言的精髓。这几个概念就像...

    C语言FAQ 常见问题列表

    难道在C语言中一个结构不能包含指向自己的指针吗? o 2.7 怎样建立和理解非常复杂的声明?例如定义一个包含 N 个指向返回指向字符的指针的函数的指针的数组? o 2.8 函数只定义了一次, 调用了一次, 但编译器提示...

    C语言文件操作及函数大全

    C语言文件操作及函数大全 2.文件操作函数: (1)文件打开函数fopen fopen函数用来打开一个文件,其调用的一般形式为: 文件指针名=fopen("文件名","使用文件方式");...对于文件使用方式有以下几点说明:

    c语言程序设计标准教程

    对于位域的定义尚有以下几点说明: 1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如: struct bs...

Global site tag (gtag.js) - Google Analytics