c语言巩固,巩固一下C语言中的指针

写了几段代码,再巩固一下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语言中的指针数组是什么,像 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语言中的指针和内存泄漏几种情况

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值