c语言变量为什么要定义,C语言为什么要规定对所用到的变量要“先定义,后使用”...

本文详细介绍了C语言中的变量声明、初始化、指针的声明与使用,以及*和&操作符的作用。通过实例解析了指针自增、解引用等操作的执行顺序,并强调了错误用法可能导致的问题。此外,还讨论了常量指针初始化的特殊情况,帮助读者深入理解C语言指针的本质。
摘要由CSDN通过智能技术生成

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

int a=10;

以上一句话对变量a进行了声明,定义以及初始化

extern int a;

以上一句话仅仅对变量a进行了声明,将a的链接属性设置为external

int *p;

以上定义了一个指针

int a=10;

int *p;

p=&a;

以上为指针变量进行了赋值

说明:

首先*操作符被称为“间接访问操作符”也叫“解引用操作符”,他的作用很简单,就是对它的右操作数进行解引用,这么说吧,间接访问操作符的右操作数是一个地址,不过这里的地址只是相当于一个字符串,并没有真正的在计算机内存中标识一个位置,只有对这个操作数进行解引用,才能真正定位到计算机的内存中相应的地址上;接下来是&操作符,这个被称作“取地址操作符”,首先要明确,指针变量中存储的不是一个具体的数值,他存储的是一个地址“字符串”,p=&a,是将a的地址放入到p这个指针变量中,补充一句,在C语言中指针变量一般占有4个字节的内存

int *p=12;

以上表达式是错误的,千万不要在实际编程中进行使用,可能有些编译器不会报错,但不代表所有编译器不报错,但即使不报错也不要这么使用

说明:

首先该表达式给绝大多数初学者的印象是给指针p所指向的内存位置赋上值12,但是我们要注意了这里仅仅是对指针变量进行了声明以及定义,也就是说编译器仅仅在内存中替指针变量p分配了4个字节的内存,而并没有位指针变量p所指向的位置分配内存,也就是说int *p=12这个表达式的意义是未明确的,因为12这个值得具体存放位置编译器并不知道,笔者检测过,在MinGW(gcc在windows下的移植工具集)中,这样写仅仅是报“警告”,但这样写是错误的,所以绝对不要这么写

int a=12;

int (int *)1000=&a;

以上是为常量指针进行初始化,但是在C编程中我们可以说是绝无可能遇到这种情况,因为C语言中内存的分配并不是固定的

int a=100;

int *p=&a;

*++p;

看到以上表达式很多初学者就要困惑了,因为前缀自增操作符的优先级要高于间接访问操作符的优先级,那对于*++p;这个表达式而言是不是就应该后执行间接访问操作符呢?这里笔者纠正一下,如果是两个操作符同时具有相应的操作数,那么就遵循操作符的优先级来进行运算,但是这里的*++p;这样的表达式,我们看到只有一个操作数,而间接访问操作符和前缀自增操作符都是自右右左的结合性,所以这里先执行自增操作,也就是将指针变量p所存储的地址加1,之后再进行解引用,定位到具体的内存中,这里假设自增前p的地址是201,那么自增后再解引用,就会定位到202这个内存上

int a=100;

int *p=&a;

*p++;

看了上面的解说后,一般的初学者看了*p++;这样的表达式,大概会兴奋的说,这里必然是后缀自增先执行,哈哈哈,笔者在这里要大笑三声然后自罚三杯,因为笔者以上并没有说清自增的特性,现在这里说说后缀自增吧,在*p++;中后缀自增操作符会优先产生p的一个副本,然后解引用操作符会作用到这个副本上并返回值,这之后自增运算符才会在原有的p上执行加1的操作;我们再来说一说*++p;这个表达式,首先前缀自增会优先在p上执行加1的操作,然后产生一个p的副本,最后解引用操作符会对增1过后的副本进行解引用,从而得到相应位置的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值