今天刚好看汇编需要,就学了学。

本篇文章会不断完善,有疑问,请在评论区留言

对星号 * 的总结

1.表示乘法,例如int a = 3, b = 5, c; c = a * b;,这是最容易理解的。
2.表示定义一个指针变量,以和普通变量区分开,例如int a = 100; int *p = &a;。
3.表示获取指针指向的数据,是一种间接操作,例如int a, b, *p = &a; *p = 100; b = *p;。
4.取指针指向的数据。例如: printf(" 内存地址 %p\n", *(p));printf("当前地址指向的值 %d\n", *(*(p)));

关于 * 和 & 的谜题

假设有一个 int 类型的变量 a,pa 是指向它的指针,那么*&a和&*pa分别是什么意思呢?

&a可以理解为(&a),&a表示取变量 a 的地址(等价于 pa),*(&a)表示取这个地址上的数据(等价于 pa),绕来绕去,又回到了原点,&a仍然等价于 a。

&*pa可以理解为&(*pa),*pa表示取得 pa 指向的数据(等价于 a),&(*pa)表示数据的地址(等价于 &a),所以&*pa等价于 pa。

多级指针 ***p3等价于*(*(*p3))

如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针。

int a =100;
int *p1 = &a;
int **p2 = &p1;
#include <stdio.h>
int main(){int a =100;int *p1 = &a;int **p2 = &p1;int ***p3 = &p2;printf("%d, %d, %d, %d\n", a, *p1, **p2, ***p3);printf("&p2 = %#X, p3 = %#X\n", &p2, p3);printf("&p1 = %#X, p2 = %#X, *p3 = %#X\n", &p1, p2, *p3);printf(" &a = %#X, p1 = %#X, *p2 = %#X, **p3 = %#X\n", &a, p1, *p2, **p3);return 0;
}

int (*p)[4] = a;

括号中的*表明 p 是一个指针,它指向一个数组,数组的类型为int [4],这正是 a 所包含的每个一维数组的类型。

二维数组的例子:用来学习 *(p+1)和 *(p)+1 的区别

#include "stdafx.h"
#include "windows.h"
#include "tlhelp32.h"
#include <stdio.h>
#include "WinDef.h"int main(){int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };int (*p)[4] = a;printf(" 取二维数组的第一行的内存地址   %p\n", *(p));printf(" 取二维数组的第一行的第一个元素   %d\n", *(*(p)+0));printf("取二维数组的第一行的第二个元素    %d\n", *(*(p)+1));printf(" 取二维数组的第二行的内存地址   %p\n", *(p+1));printf(" 取二维数组的第二行的第一个元素   %d\n", *(*(p+1)+0));printf("取二维数组的第二行的第二个元素    %d\n", *(*(p+1)+1));return 0;
}

*(p+1)+1表示第 1 行第 1 个元素的地址。如何理解呢?

*(p+1)单独使用时表示的是第 1 行数据,放在表达式中会被转换为第 1 行数据的首地址,也就是第 1 行第 0 个元素的地址,因为使用整行数据没有实际的含义,编译器遇到这种情况都会转换为指向该行第 0 个元素的指针;就像一维数组的名字,在定义时或者和 sizeof、& 一起使用时才表示整个数组,出现在表达式中就会被转换为指向数组第 0 个元素的指针。

*(*(p+1)+1)表示第 1 行第 1 个元素的值。很明显,增加一个 * 表示取地址上的数据。

根据上面的结论,可以很容易推出以下的等价关系:
a+i == p+i
a[i] == p[i] == *(a+i) == *(p+i)
a[i][j] == p[i][j] == *(a[i]+j) == *(p[i]+j) == ((a+i)+j) == ((p+i)+j)

结构体待议

#include "stdafx.h"
#include "windows.h"
#include "tlhelp32.h"
#include <stdio.h>
#include "WinDef.h"int main(){struct{char *name;  //姓名int num;  //学号int age;  //年龄char group;  //所在小组float score;  //成绩} stu1;//给结构体成员赋值stu1.name = "Tom";stu1.num = 12;stu1.age = 18;stu1.group = 'A';stu1.score = 136.5;//读取结构体成员的值printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", stu1.name, stu1.num, stu1.age, stu1.group, stu1.score);return 0;

C语言 指针 类型的用法大汇总(指针/引用/取值) *与相关推荐

  1. c语言怎么用枚举类型的字符串,c语言枚举类型的用法

    枚举类型就相当于助记符,帮助程序员记忆的.比如现在要画一张地图,用到红黄蓝绿四种颜色.为了存储方便,我们规定0=红,1=黄,2=蓝,3=绿.但是当编程到某一阶段时,程序员可能忘记了哪个数字具体对应哪种 ...

  2. c语言枚举类型enum用法参数,C语言枚举类型(Enum)

    在实际编程中,有些数据的取值往往是有限的,只能是非常少量的整数,并且最好为每个值都取一个名字,以方便在后续代码中使用,比如一个星期只有七天,一年只有十二个月,一个班每周有六门课程等. 以每周七天为例, ...

  3. c语言int16位数据范围,c语言中int取值范围为16位指的是什么16位

    1.c语言中int取值范围为16位指的是什么16位 计算机用二进制表示数值,最小单位就是位(bit),可以储存0或1,16位就是有16个储存0或1的位,其中左边第一位是符号位,0代表+ .1代表-. ...

  4. 【小甲鱼C语言】课后笔记第一章第五节——取值范围

    目录 1. 比特位和字节 2. 二进制.十进制和十六进制 3. 符号位 4. 补码(作用:就是为了解决二进制的加减乘除) 5. 二进制表示最大值和最小值 6. 基本数据类型的取值范围 7.课后习题(编 ...

  5. C语言中短整型取值范围,以c语言中短整型(signed int)的取值范围为例说明各种数据类型取值范围的计算方式与原理...

    在开始我们的正文之前,你需要先了解一下原码.反码.补码这三个概念以及这三者之间的相互转换方式. 在有了一定的了解之后,我们开始我们的介绍.在本文中,我们以短整型为例,给大家介绍该类型的取值范围的计算方 ...

  6. c语言指针类型占多少字节,关于指针占多少个字节

    开章明义,在32位系统中指针占四个字节: 说道这个问题,学过C语言的都知道,我们在定义一个指针的时候需要说明指针的类型,那么按道理来说,不同类型的指针大小应该不同啊,整形占四个字节,浮点占八个字节,其 ...

  7. c语言枚举类型enum用法及应用

    大家好,我是无际. 今天跟大家讲一下我在产品开发时,用枚举(enum)的一些骚操作. 我跟你保证,今天的内容绝对是你在书本和视频学不到的. 为什么要讲枚举呢? 因为我发现它是一个容易被遗忘,同时又非常 ...

  8. 【网络安全入门大总结】—Java语言中常用的渗透漏洞大汇总

    Java语言中常用的漏洞大汇总,建议收藏. 准备好,上课了~~~ 目录 Servlet 简介 生命周期为 接口 Struts 2 . 简介 请求流程 相关CVE Spring 简介 Spring MV ...

  9. Keil C语言数据类型,KeilC的指针类型

    话说,C语言中最精髓的就是指针的操作了.当然,本文不对C语言的指针做详细的描述.Hanny在这里只想小结一下KeilC中的指针类型. 在KeilC中,我们会常见到下述的指针定义方式: char *pt ...

最新文章

  1. Docker容器的备份与恢复,Docker镜像的备份与恢复
  2. 降低云计算成本的方法总结
  3. Eclipse 安装 lombok
  4. weblogic.rjvm.PeerGoneException
  5. php嵌套 frame,终极解决禁止网站被别人通过iframe引用嵌套套入。
  6. matlab极大无关组,matlab最大无关组
  7. 掌握新手学车技巧对于新手来说是非常重要的
  8. php表单验证内容不能为空,php校验表单检测字段是否为空的方法_PHP教程
  9. 图像阈值中的函数简述
  10. 排序算法第四篇——冒泡排序
  11. springboot项目识别不了pom.xml文件_Spring Boot Web 项目教程,Spring Boot的环境配置
  12. Solaris10 swap空间管理
  13. 基于Funcode设计C语言游戏–迷你高尔夫
  14. java创建动态数组_动态数组java实现
  15. 论文-基于深度学习的视频中 人体动作识别技术的分析
  16. 适配各种Windows分辨率,为DPI添加感知,当在高DPI时,禁用WINFORM缩放等。
  17. 电池充电语音警报——隐私政策
  18. 项目团队管理:有效管理团队的八个方法
  19. OSChina 周六乱弹 —— 女菩萨,你可愿做贫僧的……
  20. 华为路由器负载均衡_华为 AR路由 策略路由 多WAN环境下指定出口

热门文章

  1. vue 动态添加class_前端开发:Vue项目实战-Music
  2. Java黑皮书课后题第5章:*5.47(商业:检测ISBN-13)ISBN-13是标识书籍的新标准。它使用13位数字d1d2d3~d12d13,d13是校验和。如果校验和为10,则替换为0。求所有数字
  3. Java黑皮书课后题第4章:*4.26(金融应用:货币单位)重写程序清单2-10,解决将float型值转换为int型值时可能会造成精度损失的问题。读取的输入值是一个字符串,比如“11.56“
  4. 九度OJ最短摘要的生成
  5. OpenCV2:幼儿园篇 第一章 创建图像并显示
  6. 让 Python 代码运行更快的最佳方式!
  7. 斐波那契数列的3种求法及几种素数筛法
  8. Fragment创建添加切换和对应底部导航(二)
  9. Jmeter之Bean shell使用(四)——跨线程组之间的全局参数传递
  10. Angular2 组件与模板 -- 输入和输出属性