巩固一下C语言中的指针
今天无意间看到一篇文章《【C语言】 浅谈指针》,对C语言指针的总结很好! 文章地址:http://blog.csdn.net/wbq1480/article/details/51506124
写了几段代码,再巩固一下C语言知识。
我的记忆方法跟文章中的不一样。
*是取值符号,&取地址符号,()限定子表达式的符号,[]是按索引取数组乘员的符号。
优先级方面()>[]>*,&。
对于int *(*p(int))[3]; 。我是这么分析的:
int *(*p(int))[3]=>int *p1[3]:等价于 int *p1[3]
1、表示取p1里的某个元素是int指针,那么p1是一个数组,里面的东西全部是指针
p1=>*p2,p2=>p(int)
2、表示取了p2的值才是p1,显然p2也是指针(指向数组的指针);p2等效于一个函数调用,那么p一个函数
整个表达式相当于一个函数声明,返回值是指针,指向的是数组,数组的乘员又是指针。编译之后不会产生任何代码。如果要写fuck brain的代码可以用这种方式写函数声明头文件,把别人绕晕。
这里要特别注意返回的是指针,所以符合语法规则。如果把这个函数的返回值typedef成一个类型,那么就较容易理解了。
如果要写这种绕脑的代码,最好typedef一下:typedef int* (*int_array_ptr)[3];。
下面是随便写的一段代码,验证一下这个问题。
typedef int* (*int_array_ptr)[3];//这里必须要指定长度,sizeof(int_array_ptr)才知道长度
typedef int* int_array [];
typedef int* (*func_ptr)(int);
typedef int func_type(int);
int* TestFunc(int a)
{
printf("TestFunc\n");
return 0;
}
int** TestFunc2(int a)
{
printf("TestFunc2\n");
return NULL;
}
int func2(int a)
{
printf("func2\n");
return NULL;
}
int main()
{
int *(*ps1(int))[3];
int *(*(ps2(int)))[3];
int a = 1;
int *b = &a;
int *c = &*b;
int d = *&a;
printf("a=%d\n", a);
printf("*b=%d\n", *b);
printf("*c=%d\n", *c);
printf("d=%d\n", d);
//int **(ps3(int))[3];
//int ** ps4(int)[3];
int_array_ptr ps5(int);//函数声明
//int *((*ps)(int))[3];
//int* (*p)(int)[3];
func_ptr func[3];//数组声明,数组的成员是函数指针
func_type func2;//函数声明
int size = sizeof(func_type*); int size = sizeof(func_type);//语法错误,对一个函数使用sizeof不成立
func2(3);//只有有实现的函数才能调用,如果把func2的实现删除,编译会报找不到符号
//printf("ps1=%X\n", &ps1);//函数没有实现,所以ps1不存在,编译报找不到符号
//printf("ps2=%X\n", &ps2);//
printf("funcptr=%X\n", func);
printf("funcarrayptr=%X\n", &func);
printf("func2ptr=%X\n", &func2);
//memcpy(&func2,&TestFunc2,4);//不能修改代码段的数据,执行报错,&func2指向程序代码段中的地址, //一个程序平坦的内存被划分为代码段、数据段
//p = func[0];
return 0;
}
巩固一下C语言中的指针的更多相关文章
- C语言中的指针数组
C语言中的指针数组是什么,像 char *a[]={"ddd","dsidd","lll"}; 这里讲一下注意如果我们使用了a也就是首元素的 ...
- 【ZZ】C 语言中的指针和内存泄漏 & 编写高效的C程序与C代码优化
C 语言中的指针和内存泄漏 http://www.ibm.com/developerworks/cn/aix/library/au-toughgame/ 本文讨论了几种在使用动态内存分配时可以避免的陷 ...
- GO语言中的指针
http://www.tizgrape.com/?p=100 Go语言中的指针语法和C++一脉相承,都是用*作为符号,虽然语法上接近,但是实际差异不小. Go使用var定义变量: var v6 *in ...
- C语言中的指针笔记
C语言指针 得到变量的地址 可以使用&运算符找到变量保存在内存中的位置 int x = 1; printf("x的内存地址是"%p\n",&x) %p格式 ...
- C语言中的指针加减偏移量
C语言指针偏移技巧(也是一个要注意的坑) - 陈杰柱的博客 - CSDN博客 https://blog.csdn.net/cjzjolly/article/details/82116772 C语言中 ...
- C 语言中的指针和内存泄漏
引言对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧 ...
- C语言中的指针和内存泄漏
引言 对于任何使用C语言的人,如果问他们C语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧,但是 ...
- C语言中的指针学习(小黑板)
指针是C语言中的精华所在,也是C语言的危险之在,今天又重现温习了一下C语言,做了一下总结. 欢迎批阅. (1)指针的含义指针的本质也是数据类型,它是指向地址的变量.例如: { int a = 10; ...
- [C]C语言中的指针和内存泄漏几种情况
引言 原文地址:http://www.cnblogs.com/archimedes/p/c-point-memory-leak.html,转载请注明源地址. 对于任何使用C语言的人,如果问他们C语言的 ...
- 论C语言中二级指针和二维数组之间的区别
刚开始学习C语言的时候,觉得一个数组可以定义一个一级指针去访问,想当然的就觉得可以定义一个二级指针去访问二维数组.很显然这是错误的. 我们来看看C语言的数组在内存中的存储方式. 实际上C语言中的数组, ...
随机推荐
- [kuangbin带你飞]专题十 匹配问题
A-L 二分匹配 M-O 二分图多重匹配 P-Q 二分图最大权匹配 R-S 一般图匹配带花树 模板请自己找 ID Origin Title 61 / 72 Problem A HD ...
- Codeforces 450D Jzzhu and Cities [heap优化dij]
#include<bits/stdc++.h> #define MAXN 100050 #define MAXM 900000 using namespace std; struct st ...
- ubuntu14.04开启crontab日志
ubuntu默认没有开启cron日志记录 1. 修改rsyslog sudo vim /etc/rsyslog.d/50-default.conf cron.* /var/log/cron.log # ...
- OC基础(20)
Protocol基本概念 Protocol注意事项 Protocol类型限制 代理设计模式 *:first-child { margin-top: 0 !important; } body > ...
- 重设mysql的root密码,MAC OSX
前些天装得mysql突然链接不上了,原谅我小白,没有在安装后改密码,mysql初始登陆不需要密码,但是之后root是有个临时密码的,然后..然后就登不上了. 网上有很多改密码的帖子,关键的UPDATE ...
- Appium+Maven+TestNG(ReportNG)环境搭建(详细过程)
最近群里经常有人会问到关于maven构建Appium测试项目以及使用testNG生成测试报告的问题,试着搭建了一下,下面是过程: jdk安装过程我这里就不说了 一.下载eclipse,推荐下载Ecli ...
- Mysql 自动增长 重置
重置 MySQL 自增列 AUTO_INCREMENT 初时值 注意, 使用以下任意方法都会将现有数据删除. 方法一: delete from tb1; ALTER TABLE tbl AUTO_IN ...
- 帕金森定律(Parkinson's Law)
帕金森定律(Parkinson's Law)是官僚主义或官僚主义现象的一种别称, 是由英国历史学家.政治学家西里尔·诺斯古德·帕金森(Cyril Northcote Parkinson)通过长期调查研 ...
- AX2012全新的批处理方式
AX2009 的批处理操作我们是通过RunBaseBatch framework,我们所要做的事情就是继承RunBaseBatch class,实现里面该实现的方法来执行批处理. AX2012 的批处 ...
- TCP/IP详解学习笔记(9)-- 广播,多播,IGMP:网际组管理协议
1.概述 IP有三种地址:单播地址, 广播地址,多播地址. 广播和多播仅应用于UDP. 每个以太网帧包含源主机和目的主机的以太网地址.通常每个以太网帧发往单个目的主机,目 ...