首页 > 其他分享 >指针简介:欲送你花,先找你家

指针简介:欲送你花,先找你家

时间:2024-11-08 18:47:41浏览次数:3  
标签:先找 变量 指向 int 简介 girl ptr 指针

从本质上来说,指针(pointer)是一个值为内存地址的变量。它指出指针的两个核心:

①指针是一个变量。它具有和其他变量一样的属性:有名、有值、有地址(隶属“三友”集团)。

②指针的值是内存地址。这指出了指针区别于其他变量的特殊性,它的值是内存地址。

一、指针的命名

常用以下两个名字作为指针变量名:

①p(pointer的首字母)

②ptr(pointer各音节上的辅音字母)

二、指针的赋值

将一个普通变量girl的地址赋给指针ptr,可以用如下代码:

ptr = &girl;    // 把girl的地址赋给ptr

&为取地址运算符,表示取后面东东的地址。

把girl的地址取出来赋给ptr,所以现在ptr的值就是girl的地址,就好比记下姑娘家的门牌号。

对于上面的赋值语句,我们常说ptr“指向”girl。这个指向关系是这样形成的:

b290cc4041564317bc39dbb6429e00f8.png

有了这个指向关系,就能通过指针ptr找到girl。就好比你指向姑娘的家,在那儿就能找到那个姑娘一样。

三、获取指针指向的值

你存下了姑娘家的地址,自然就能根据地址找到姑娘。具体如何找到姑娘呢?这需要用到一个新的运算符*。

*称为解引用运算符(dereferencing operator),也称间接运算符*(indirection operator),用于获取指针指向的变量的值。它所表达的意思就是,根据它后面的内存地址(指针就是地址),找到那个地址里存的东西。

meizi = *ptr; // 找出ptr指向的变量的值,也就是girl的值

ptr = &girl; 加上meizi = *ptr;就相当于meizi = girl; 你能想明白吗?

找到了girl,你还可以对她做点什么,比如送她一束花:

*ptr = flower;

这个过程是这样的:你根据girl家的地址ptr找到了girl,然后送给girl一束flower。

四、指针的声明

像变量一样,要使用指针,需要先对其进行声明。

指针的声明方式与普通变量差不多,就是要多加一个*号,示例如下:

int *pi; // pi是指向int类型变量的指针
char *pc; // pc是指向char类型变量的指针

这个声明有几个要点需要说明一下:

1声明指针的写法。

*号挨着谁都可以,上面的int *pi;还可以写成int* pi;或者int * pi;

2.声明的类型

前面的类型并不是指指针的类型,而是指针指向的变量的类型。指针本身就是一个整数(确切地说是一个无符号整数),并不需要专门指定类型,我们也用不着管它是什么类型。注意,虽然指针的值是整数,但并不能说指针的类型就是整型,因为一些处理整数的操作不能用来处理指针。例如,可以把两个整数相乘,但是不能把两个指针相乘。所以,指针实际上是一个新类型,不是整数类型。也正因为如此,C专门为指针提供了%p格式的转换说明。

那么为什么在声明指针时非要指明指针指向的变量的数据类型呢?

这是因为不同的变量类型占用的存储空间不同,比如int类型通常占用4个字节,而double类型占用8个字节。如果不指定类型,那在取变量的值和指针偏移运算时就可能出现错误。

(1)取变量的值。

如果只知道变量的地址,不知道变量的类型,就相当于你只知道从内存哪个位置取数据,但却不知道取多大块数据,自然就取不到想要的数据。

(2)指针偏移

指针偏移指的是加减运算,需要注意的是,加减的单位不是字节,而是指针所指向的数据类型的大小。例如,对于int *类型的指针,加1实际上是指针指向的内存地址增加了4个字节(假设整数占4个字节)。如果不指定类型,显然无法让指针偏移到正确的地址。

除了以上两个主要原因,指定指针指向变量的类型显然提高了代码的可读性。其他程序员在阅读代码时,可以更容易地理解指针所指向的数据类型及其用途。

除此之外,还能减少数据类型混淆错误。因为编译器提前知道了指针指向的数据类型,当你错误地把指针指向其他类型时,编译器就能给出错误提示。

比如下面的例子:

#include<stdio.h>
int main() {
    int a = 5;
    double b = 9.2;
    int *ptr = &a;  // 声明一个指向 int 类型的指针
    *ptr = 10;      // 通过指针修改 a 的值
    ptr = &b;  // 错误:将指向int型的指针指向了double型的变量
    return 0;
}

编译器会给出类似下面的警告:

assignment to 'int *' from incompatible pointer type 'double *'

3.指针声明的本质含义

在声明指针时,*被称为“指针声明修饰符”,虽然叫了个新名,但和前面讲的解引用运算符本质上是一样的,都是获取指针指向的变量的值。比如int *p;的本质含义是这样的:取出指针p指向的变量的值,这个值是int类型的。也就是说,int * p;的意思是p是一个指针,*p是int类型。明白了这一点,指针的指针也就很好理解了,比如int **p;说的是取出指针p指向的变量(为方便说明,假设这个被取出来的变便为q)的值,这个值还是一个地址,然后再取出q指向的变量的值,这个最后取出来的值是int型,也就是**p是int型。

现在,你明白为什么要把指针的声明放到最后讲解了吧?

 

 

 

标签:先找,变量,指向,int,简介,girl,ptr,指针
From: https://blog.csdn.net/jjmhx/article/details/143624453

相关文章

  • SNI简介
    ServerNameIndication(SNI)是TLS(传输层安全协议)中的一个扩展,允许客户端在建立安全连接时,告诉服务器它要访问的具体主机名(域名)。这个信息通常在SSL/TLS握手过程中被传递,特别是在客户端和服务器之间交换加密信息之前。SNI解决了一个关键的问题:多个域名共享同一个IP......
  • 指针学习
    指针可以理解为保存地址的数据类型。其数据类型大小在32位系统中为4个字节,在64位系统中为8个字节。常量指针inta=10;constint*p=&a;const在int*之前的为常量指针,特点是*p不可变,但p可变。在图中红色框住的10是不允许通过指针修改的,但还是可以通过a这个途径修改,因为cons......
  • 【C++进阶】智能指针的使用及原理(1)
    1.智能指针的使用场景分析下面程序中我们可以看到,new了以后,我们也delete了,但是因为抛异常导,后面的delete没有得到执行,所以就内存泄漏了,所以我们需要new以后捕获异常,捕获到异常后delete内存,再把异常抛出,但是因为new本身也可能抛异常,连续的两个new和下面的Divide都可能会抛异......
  • 人工智能--自然语言处理简介
    上一篇:《人工智能模型训练中的数据之美——探索TFRecord》序言:自然语言处理(NLP)是人工智能中的一种技术,专注于理解基于人类语言的内容。它包含了编程技术,用于创建可以理解语言、分类内容,甚至生成和创作人类语言的新作品的模型。在接下来的几章中,我们将会探讨这些技术。此外,现在有......
  • CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro
    说明此文章为转发的,方便日后查看。系统演示环境http://www.cc-admin.top/#/home简介CC-ADMIN前端简介现在市面的上后台管理系统很多,不差你这一个,为啥又来个轮子?答:材料不一样。本轮子的选材是在考察过antv、element之后选择了quasar,前两个很优秀,尤其是antv的外观我特......
  • STM32学习之SPI的简介与使用
    SPI(SerialPeripheralInterface)是一种常用的同步串行通信协议,它被广泛应用于多种电子设备和组件之间的通信。以下是一些SPI常用于连接的设备类型:存储设备:NORFlash:用于存储固件或数据的非易失性存储器。NANDFlash:用于大容量数据存储的非易失性存储器。传感器:加速度......
  • 【C++11】智能指针
    一.为什么需要智能指针        学习C++的人,一直在接触裸指针,一边感受着它的强大,一边感受着它的坑爹。当然,坑不坑爹在于开发者,指针本身近乎完美,但奈何用的人比较猥琐,给自己埋下无数的坑,还哭喊着指针不好用,那么今天要介绍的智能指针可以释放大家在使用裸指针时的一些压......
  • cpp_9【用指针在更改主函数中的变量值】
    5.编写并测试一个函数larger_of(),该函数把两个double类型变量的值替换为较大的值。例如,larger_of(x,y)会把x和y中较大的值重新赋给两个变量。#include<stdio.h>voidlarger_of(double*x,double*y){ if(*x>*y){ *y=*x; } elseif(*y>*x){......
  • ITM定时器简介(1)
    一、定义ITM定时器是对输入的时钟进行计数,并在计数达到设定值时触发中断16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等......
  • 算法每日双题精讲——双指针(移动零,复写零)
    ......