C语言指针

作者: 16020110071张鑫才 | 来源:发表于2020-11-15 21:28 被阅读0次

学号:16020110071

姓名:张鑫才

原文链接:https://blog.csdn.net/weixin_45791445/article/details/109021475?utm_medium=distribute.pc_category.none-task-blog-hot-19.nonecase&depth_1-utm_source=distribute.pc_category.none-task-blog-hot-19.nonecase

【嵌牛导读】C语言指针

【嵌牛正文】

1. 内存

内存(Memory)也被称为内存储器主存储器,其作用是用于暂时存放CPU中的运算数据,我们程序必须装入内存之后才能运行。

计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用 4 个字节,char 占用 1 个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。我们将内存中字节的编号称为地址(Address)或指针(Pointer)

2. 一切都是地址

CPU 访问内存时需要的是地址,而不是变量名和函数名!变量名和函数名只是地址的一种助记符,当源文件被编译和链接成可执行程序后,它们都会被替换成地址。编译和链接过程的一项重要任务就是找到这些名称所对应的地址。

变量名和函数名为我们提供了方便,让我们在编写代码的过程中可以使用易于阅读和理解的英文字符串,不用直接面对二进制地址,那场景简直让人崩溃。

需要注意的是,虽然变量名、函数名、字符串名和数组名在本质上是一样的,它们都是地址的助记符,但在编写代码的过程中,我们认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地址。

3. 那么什么是指针?

数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量。

在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。指针变量的值就是某份数据的地址,这样的一份数据可以是数组、字符串、函数,也可以是另外的一个普通变量或指针变量。

也就是说,定义指针变量时必须带*,给指针变量赋值时不能带*。

也就是说,使用指针是间接获取数据,使用变量名是直接获取数据,前者比后者的代价要高。

4.指针的意义

指针的意义就是间接访问。

由于CPU的设计,很多情况下是需要寄存器去存储某个变量的内存地址,由于此时寄存器里存放的是内存地址,

所以可以直接通过这个寄存器去读写该变量值。这个就是间接访问。到了C语言里,发明了另外一种变量类型,指针变量,专门用于存放地址。

5.指针与数组

p[i] <=> *(p+i)

在数组中,指针变量每次加 1,它们的地址分别增加 4、8、1,正好是 他们对应的数据类型+(int、double、char 类型)的长度

数组在内存中只是数组元素的简单排列,没有开始和结束标志,在求数组的长度时不能使用sizeof(p) / sizeof(int),因为 p 只是一个指向 int 类型的指针,编译器并不知道它指向的到底是一个整数还是一系列整数(数组),所以 sizeof(p)求得的是 p 这个指针变量本身所占用的字节数,而不是整个数组占用的字节数。

也就是说,根据数组指针不能逆推出整个数组元素的个数,以及数组从哪里开始、到哪里结束等信息。不像字符串,数组本身也没有特定的结束标志,如果不知道数组的长度,那么就无法遍历整个数组。

6.* 和 &

关于 * 和 & 的谜题

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

&a可以理解为(&a),&a表示取变量 a 的地址(等价于 pa),*(&a)表示取这个地址上的数据(等价于 pa 注:这里pa前有一个星号,csdn识别为了斜字符号了,没有显示)。绕来绕去,又回到了原点,&a仍然等价于 a。

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

在我们目前所学到的语法中,星号*主要有三种用途:

表示乘法,例如int a = 3, b = 5, c; c = a * b;,这是最容易理解的。

表示定义一个指针变量,以和普通变量区分开,例如int a = 100; int *p = &a;。

表示获取指针指向的数据,是一种间接操作,例如int a, b, *p = &a; *p = 100; b = *p;。

int a = 0;

int *p = &a; // 取地址,p指向了a

printf("%d\n", *p); // 取内容 *可以想成取内容符,间接运算

相关文章

  • C语言05- 指针

    C语言05- 指针 13:指针 指针是C语言中的精华,也是C语言程序的重点和难点。 13.1:指针定义与使用 指针...

  • 02-C语言的指针

    02-C语言的指针 目标 C语言指针释义 指针用法 指针与数组 指针与函数的参数 二级指针 函数指针 指针在C中很...

  • C语言指针总结大学霸IT达人

    C语言指针总结大学霸IT达人 C语言的指针是C语言区别其它语言的最主要的特定之一。有了指针,C语言就可以抛开所有束...

  • 带小白学C语言指针

    C语言里指针才是C语言的开始和指针;C语言里基本所有东西都是由指针演变而成; 指针是指向地址的变量,类型就是指针...

  • 在Swift中使用C语言的指针

    在Swift中使用C语言的指针 在Swift中使用C语言的指针

  • [Swift]结构体指针操作

    C语言的指针操作 在c语言中申明一个变量并通过指针修改该变量的值 a value is 2 c语言操作结构体指针操...

  • Go语言-指针

    Go语言中的指针不同于C语言,Go语言的指针使用方法要简单很多。当然和C语言从指针定义到指针的使用都有很大的不同。...

  • C语言中的指针与数组

    C语言中的指针与数组 @(C语言)[排序算法, 快速排序, C实现] 引言 相信指针与数组是不少同学在初学C语言时...

  • 指针数组和数组指针

    指针数组|存储指针的数组 在C语言和C++语言中,数组元素全为指针的数组称为指针数组。 例如:int *p[10]...

  • iOS开发 -- C语言基础8(指针)

    iOS开发 -- C语言基础8(指针) 指针是C语言中非常重要的数据类型,如果你说C语言中除了指针,其他你都学得很...

网友评论

    本文标题:C语言指针

    本文链接:https://www.haomeiwen.com/subject/amrobktx.html