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

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过后的副本进行解引用,从而得到相应位置的值

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

  1. C语言变量d的定义法则,C语言变量命名规则(3页)-原创力文档

    1.严格采用阶梯层次组织程序代码: 各层次缩进的分格采用 VC的缺省风格,即每层次缩进为4格,括号位于下一行. 要求 相匹配的大括号在同一列,对继行则要求再缩进4格.例如: 2.提示信息字符串的位置 ...

  2. python定义一个复数类complex、内有两个成员变量_python(一):python语言基础

    一.python语言基本的8个要素 Python语言的8个要素:数据类型.对象引用.组合数据类型.逻辑操作符.运算操作符.控制流语句.输入/输出.函数的创建与引用.除此之外还有一个非常重要且无处不在的 ...

  3. c语言的指针和java_C语言指针变量的定义和使用(精华)

    数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量. 在C语言中,允许用一个变量来存放指针,这种变量称为指针变量.指针变量的值就是某份数据的地址,这样的一份数据可以是 ...

  4. C语言定义外部文件可使用的结构体和结构体变量

    如果想在a.c中定义一个可以在b.c中可以使用的结构体变量,则可以参照一下方法: 首先在a.h中定义结构体和声明结构体变量,如: typedef struct struct_a { //结构体内容 } ...

  5. c语言变量申明和定义区别,C语言中变量定义与声明的区别

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介 ...

  6. jstl动态取变量_C语言的变量名

    变量名是用来标识某个内存块的 地址就是地址啦,如是变量名的话,用取地址运算符&就可以得到它标识的内存块的地址, 而指针变量呢,它本身也是一个变量名,只不过它标识的那块内存存放的是一个地址值 变 ...

  7. C语言实现易语言变量框,c语言实现简单的易语言

    大家熟知的易语言底层其实就是c语言来实现的,c语言的32个关键字加上一些常用的其他,使用#define这种宏定义来实现简单的汉语替换 1.下面就先打开VisualStudio,在头文件目录下新建一个 ...

  8. c语言不允许对数组的大小做动态定义,数组,C语言程序设计课件,与中南大学出版社教材相配套.ppt...

    <数组,C语言程序设计课件,与中南大学出版社教材相配套.ppt>由会员分享,可在线阅读,更多相关<数组,C语言程序设计课件,与中南大学出版社教材相配套.ppt(32页珍藏版)> ...

  9. long long c语言_带你打开C语言的大门之C语言的变量

    什么是变量,我们看名字就能知道,能改变的量就是变量,C语言的变量就是程序在运行时候的值能改变的量,我们称为变量. 怎么来记忆变量的语法呢?我们根据这么一个例子来做改变, 变量比做一个酒店,那我们对应的 ...

  10. c语言指针自定义函数,c语言函数指针定义,指针函数和函数指针的区别

    往往,我们一提到指针函数和函数指针的时候,就有很多人弄不懂.下面就由小编详细为大家介绍C语言中函数指针,指针函数和函数指针之间的区别. c语言指针函数定义: 函数指针是指向函数的指针变量. 因此&qu ...

最新文章

  1. android模拟器的数据存放,Android模拟器在哪里存储SQLite数据库?
  2. POJ3264[线段树]
  3. Ubuntu中用户名密码和root密码修改
  4. 基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台
  5. USTC English Club Note20171013(2)
  6. acm公选课第三节4.7直播4.9补 递归 深搜啥的
  7. chrome android 远程调试,chrome 远程调试
  8. 室外建筑表现3Dmax和vray常用材质参数设置
  9. JAVA面试题(part5)--多态与抽象类
  10. LeetCode 455. 分发饼干(贪心)
  11. php未定义常量破解,PHP未定义的常量错误没有意义
  12. 全球信息产业的云转型浪潮
  13. Linux系统管理(11)——linux下jdk的安装及环境变量配置
  14. 根据银行卡账号获取所属银行php
  15. 如何在photoshop中应用3DLUT预设?ps怎么安装.3dl、.look、.cube预设?
  16. SICNU ACM新生第一次考核
  17. 苹果手机怎么打开压缩文件_wx无法打开压缩文件的2种解决方法(以苹果手机为例)...
  18. javajavaScript常见校验器
  19. 解析mac苹果电脑与Windows电脑的区别。他们各自有什么优势?
  20. C语言学习1——第一、二、三章学习记录

热门文章

  1. 99.999%,提升ElasticSearch稳定性的秘密
  2. 致谢!LF AI Day
  3. AAC音频裸码流时间戳与时间长度的关系
  4. c++协程2 (boost::coroutine)
  5. getcwd()函数用法
  6. Java程序员需要掌握的计算机底层知识(三):进程、线程、纤程、中断
  7. 标记接口,注解和注解处理器的前世今生
  8. java 8中 predicate chain的使用
  9. php把一个数组放在另一个数组的后面,在PHP中的另一个数组之间注入一个数组
  10. 30分钟学玩转RabbitMQ