C语言有关指针的变量声明中的几个易错点

Technorati 标签: 指针,typedef,const,define
我们都知道,至少听说过指针对于C语言中的重要意义,但是在使用指针时却常常让我们痛不欲生,这里有几个在声明指针有关的变量时易错的地方。

1. int* 和 int * (注意空格的位置)

对于单变量声明,即一条语句中只声明一个指针变量的情况,没有区别;原因是C语言允许形式的自由性。即以下两种声明方式效果相同。
[c++] view plaincopyprint?
1. inta;
[c++] view plaincopyprint?
1. int
a;

对于一条语句中声明多个指针变量的情况,有很大区别。
[c++] view plaincopyprint?
1. int* a, b,c;

对于这条语句,常会造成我们的误解:认为声明了三个整型指针。但是正解是:只有a是整型指针,b和c都是普通的整数。

这里的星号“”号只是声明变量a的一部分,以上的变量声明相当于:
[c++] view plaincopyprint?
1. int
a;
2. intb;
3. intc;

如果希望在一条语句中声明多个整型指针,正确的方式应该是:
[c++] view plaincopyprint?
1. inta, b, *c;

2. typedef 和 #define 在创建类型别名时的区别

在C语言中实现创建类型别名的方法有两种:一种是使用typedef;一种是使用#define。使用方法也类似。
[c++] view plaincopyprint?
1. typedefintNEW_INT_TYPE1;/int在前/
2. NEW_INT_TYPE1 a1 = 1;
3. #define NEW_INT_TYPE2 int /int在后/
4. NEW_INT_TYPE2 a2 = 2;
5.
6. printf("%d /n",a1);
7. printf("%d /n",a2);

但是如果需要创建新类型名时,我们只应该使用typedef,而不是#define。因为#define仅仅是在编译的时候做简单的替换工作,所以在处理一些问题上会有缺陷。
[c++] view plaincopyprint?
1. intm=2;
2. typedefint NEW_INT_TYPE3;/int在前/
3. NEW_INT_TYPE3 a3, a4;
4. a3 = &m;/
指针赋值/
5. a4 = &m;/
指针赋值/
6. #define NEW_INT_TYPE4 int
/int在后/
7. NEW_INT_TYPE4 a5, a6=6;
8. a5 = &m;/指针赋值/
9. printf("%d /n",a3);
10. printf("%d /n",
a4);
11. printf("%d /n",a5);
12. printf("%d /n",a6);
13.
14. /
运行结果:
15. 2
16. 2
17. 2
18. 6*/

分析:a3和a4是整型指针,a5是整型指针,但是a6只是整型(只要记住#define 仅仅是做替换操作,将NEW_INT_TYPE4替换为int,而int a5, a6; 的结果是“a5是整型指针,a6是整数”);

3. “常量指针”和”指向常量的指针”

对于常量变量:int const a 和const int a 效果相同;都是声明一个整型的变量a,且a是常量,其值不能改变(由于其值不能改变,其赋值方式只有两种:一种是声明时初始化,如int const a=1; 一种是其作为函数的形式参数,函数被调用时用实参来初始化)。

对于含有指针时,根据声明时const和星号"*" 的位置,有三种形式:

**形式** **名称** **说明** **分析方法**
int const *p 指向常量的指针 能修改指针本身的值,但是不能修改其指向的值 从变量标识符开始(即从右向左),①*p指向一个整数;②const修饰”*p”,表示*p是一个常量,即p指向的值是一个常量。所以,不可以修改”*p”,即不可修改p指向的值。
const int *p 指向常量的指针 同上 同上
int * const p 指针常量 能修改其指向的整型的值,但是不能修改指针本身的值 从变量标识符开始(即从右向左),const修饰p,表示p是常量,即不能修改p本身,但p指向的值可以修改。

总结,区分这两种类型的顺序是:从右向左看,一步一步的确定。

衍生的更为特殊的指针:指向常量的常量指针,声明方式是 int const * const p; 对于它,“指针本身的值”和“指向的值”都不能修改。

注意:有常量声明的变量只有两种赋值方式;一种是在声明时直接赋值,如int m; int * const p = &m; 另一种方法针对在函数中声明的形式参数,在函数被调用时被赋值,例如:当是不需要修改数组的元素时,形式参数使用int const a[],即a指向的内容不能修改。
[c++] view plaincopyprint?
1. voidfirstTest(){
2. intm = 2;
3. intconstp = &m;/指针p 是常量指针,要在声明时赋值/
4. /
不能写为 int * const p; p = &m;/
5.
6. printf("%d /n",
p);
7. p = 5;/可以改变指针p 指向的值/
8. printf("%d /n",
p);
9. getchar();
10. p=&m;/编译报错,因为不能改变指针p本身 的值,/
11. }
12. voidsecondTest(){
13. intm = 2;
14. intn = 3;
15. intconstp;/指向常量的指针/
16. p = &m;
17. /
也可以写为 int const p = &m; /
18. printf("%d /n",p);
19. p = &n;/
可以改变指针p本身的值/
20. printf("%d /n",
p);
21. p = 3;/ 编译报错,不能修改它指向的值。虽然这里p的值本来就是2/
22. }
原文链接: https://www.cnblogs.com/wangfengju/p/6173004.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/94450

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月10日 上午2:37
下一篇 2023年2月10日 上午2:37

相关推荐