首页 > 编程语言 >C程序设计——基本变量类型(指针杂谈)

C程序设计——基本变量类型(指针杂谈)

时间:2024-08-16 23:24:01浏览次数:11  
标签:变量 指向 int piInt 杂谈 iInt 程序设计 指针

瞎聊

本文后面的内容,可以暂时看不懂,以后如果从事这一行,慢慢会理解,但是这句话要记住:如果 piInt 是一个指向整型的指针变量,那么  *piInt 就是一个整型变量;类似的,如果pcChar是一个指向字符型的指针变量,那么 *pcChar 就是一个字符型的变量;……

其实这部分内容,也许放在 C程序设计——基本变量类型(指针0)的前面更合适,但是思来想去,还是先把指针讲个差不多,再讲这个。

我希望大家记住这句话,将来再慢慢理解:C语言把计算机所有的外设,都抽象为变量。

当你用C语言访问显示器、鼠标、键盘时,最终访问的是一个一个的变量。当然有些变量,被用函数给封装起来,看起来好像是通过调用函数,来控制屏幕显示、获取鼠标状态。

变量

当你入学报名的时候,如果你住校,学校会给你分配一个宿舍,比如你们学校的第14号楼,3层有一个编号360的宿舍刚搞还有一个床位,然后老师大笔一挥,你就住这间了。我们把你住的这个宿舍用一串数字来表示就是: 14360,14代表第14号楼,360代表3层第60号房间。在你们学校,一说14360,就能唯一的标识你们宿舍,你问任何一个同学,都可以告诉你怎么去14号楼,然后上3层找60号宿舍。

计算机的也是一样的,所有外设,包括内存、硬盘、鼠标等等,都分配了很多地址,就好像前面讲了每6个床位分配一个宿舍号,计算机也类似,按照目前的标准,每8位二进制数分配一个地址,通常这8位二进制数,被看做一个整体,叫做一个字节。

C语言下,当你定义一个变量,像下面这样:

    int iInt ;

编译器生成代码的时候,会按照既定的规则(算法)给变量 iInt 分配一片4字节(32bit)连续的内存空间,前面我说了,计算机给每个字节都分配的地址,这一个整形变量占连续4个字节,理论上就有四个地址,按那个算呢?C语言规定,地址中最小的一个,作为整形变量的地址。强调一下,当你定义一个变量是,无论这个变量占多少字节,计算机分配内存时,一定是分配一片地址连续的空间,来存储这个变量。

比如计算机给上述代码中的  iInt 分配了四个字节的空间,地址分别是 4、5、6、7,那么当你给 iInt 取地址(&iInt )时,得到地址将是4。比如下面这段代码:

int main(void)
{
    int iInt ;
    int *piInt ; // 定义指向整形的指针变量
    piInt = &iInt; // 将iInt 的地址,赋值给 piInt

    iInt = 100;

    printf("piInt %d\r\n", piInt); // 打印指针变量的值
    printf("&iInt %d\r\n", &iInt); // 打印 iInt 的地址值
    printf("iInt %d\r\n", iInt); // 打印 iInt 的值
}

编译后运行结果如下:

我们从打印结果上可以看到变量 iInt 的值是 100,变量 iInt 的地址值是: 6422036。按照前面的讲解,变量 iInt 占4个字节,每个字节都有地址,其中最小的一个是 6422036,另外三个字节的地址就是 6422037、6422038、6422039 。

指针变量,也是变量

我们还看这段代码(不用比较了,就是从上面复制、粘贴过来的)

int main(void)
{
    int iInt ;
    int *piInt ; // 定义指向整形的指针变量
    piInt = &iInt; // 将iInt 的地址,赋值给 piInt

    iInt = 100;

    printf("piInt %d\r\n", piInt); // 打印指针变量的值
    printf("&iInt %d\r\n", &iInt); // 打印 iInt 的地址值
    printf("iInt %d\r\n", iInt); // 打印 iInt 的值
}

piInt 是一个指针变量,它首先是一个变量,所以计算机也会给它分配地址连续的几个字节(有些计算机是4个字节,有些计算机是8个字节),所以从分配空间的角度,piInt 和 iInt,没有本质区别,如果硬要找区别,那就是分配的空间不一样,可能数量也不一样(当然数量也有可能一样)。既然 piInt 是变量,那就可以给它赋值,比如下面这样:

    piInt = &iInt; // 将iInt 的地址,赋值给 piInt

表示把 iInt的地址,赋值给 piInt。根据运行结果  iInt 的地址其实就是一个数字6422036 ,如果我们能未卜先知,这里直接把 6422036赋值给 piInt,效果是一样的:

    piInt = 6422036; // 如果能未卜先知,就可以用 6422036 来代替&iInt

获取指针指向的值

先明确一个概念,比如我定义一个整形变量 iInt,计算机给它分配的地址是 6422036,然后给 iInt 赋值 100,我们就说地址 6422036 指向的值是100,如果我们改变了 iInt 为 200,则我们说地址 6422036 指向的值是200 。

我们如果定义了一个指针变量  piInt,然后给它赋值 为 iInt 的地址(&iInt),给 iInt 赋值 100,我们就说指针变量 piInt 指向的值是100,如果我们改变了 iInt 为 200,则我们说指针变量 piInt 指向的值是200 。

那么我们如何获取指针 piInt 指向的值呢?像下面这样:

    *piInt ; 

请寻找下面两行的不同:

    int *piInt ; // 定义一个指针变量
    *piInt ; // 获取 piInt 指向的值

*piInt 左面有类型名,就是定义指针变量。没有类型名,就是获取指向的值。

指针指向的值还可以改变,像下面这样:

    *piInt = 200; // 改变 piInt 指向的值,使之为200

int main(void)
{
    int iInt ;
    int iValue ;
    int *piInt ; // 定义指向整形的指针变量
    piInt = &iInt; // 将iInt 的地址,赋值给 piInt

    iValue = *piInt ; // 获取 piInt 指向的值,并赋值给 iValue
    *piInt = 200; // 改变 piInt 指向的值,使之为200
}

指针变量类型的意义

我们现在知道,定义指针的时候,要声明指针指向什么类型的数据,比如下面这些:

int main(void)
{
    char *pcChar ; // 指向字符型变量的指针
    short int *psShort ; // 指向短整形变量的指针
    int *piInt ; // 指向整形变量的指针
    long int *plLong ; // 指向长正向变量的指针
    long long *pllLongLong; // 指向超长整型变量的指针
 
    unsigned char *pcChar ; // 指向无符号字符型变量的指针
    unsigned short int *psShort ; // 指向无符号短整型变量的指针
    unsigned int *piInt ; // 指向无符号整形变量的指针
    unsigned long int *plLong ; // 指向无符号长整型变量的指针
    unsigned long long *pllLongLong; // 指向无符号超长整形变量的指针
 
    float *pFloat ; // 指向单精度浮点数的指针
    double *pDouble ; // 指向双精度浮点数的指针
}

我再本节最开头说了,再强调一次:如果 piInt 是一个指向整型的指针变量,那么  *piInt 就是一个整型变量;类似的,如果pcChar是一个指向字符型的指针变量,那么 *pcChar 就是一个字符型的变量;……

因为不同类型的变量,计算机给分配的空间是不一样的,比如 char型就是1个字节,short int 就是2个字节 ……,指针变量指定的类型, 获取指针指向的值时,才能知道该取几个字节的数据。

指针变量 + 1 

先看下面这行代码:

    piInt = &iInt; // 将iInt 的地址,赋值给 piInt

经过前面的讲解,我们知道 piInt 中存放的地址,是  iInt 的4个字节中,地址最小的那个字节的。piInt 逻辑上,代表的是 4个字节的地址,因此 piInt + 1 ,逻辑上代表 iInt 后面的那个 整型数据,因此   piInt = piInt + 1 ,piInt的值加了4 。

同样的下面代码定义的指针中:

int main(void)
{
    char *pcChar ; // 指向字符型变量的指针
    short int *psShort ; // 指向短整形变量的指针
    int *piInt ; // 指向整形变量的指针
    long int *plLong ; // 指向长正向变量的指针
    long long *pllLongLong; // 指向超长整型变量的指针
 
    unsigned char *pcChar ; // 指向无符号字符型变量的指针
    unsigned short int *psShort ; // 指向无符号短整型变量的指针
    unsigned int *piInt ; // 指向无符号整形变量的指针
    unsigned long int *plLong ; // 指向无符号长整型变量的指针
    unsigned long long *pllLongLong; // 指向无符号超长整形变量的指针
 
    float *pFloat ; // 指向单精度浮点数的指针
    double *pDouble ; // 指向双精度浮点数的指针
}

如果 pcChar=  pcChar + 1,pcChar 加了 1;

如果 psShort = psShort + 1,psShort 加了2;

……

 

标签:变量,指向,int,piInt,杂谈,iInt,程序设计,指针
From: https://blog.csdn.net/tianshigexing/article/details/141270378

相关文章

  • 链表中环的检测与入口节点的查找:哈希表与快慢指针方法
    前言在数据结构中,链表是一种常见的线性数据结构。链表中的环问题是面试和实际编程中经常遇到的一个问题。本文将先复习哈希表的基本概念,然后介绍两种检测链表中环的方法:哈希表法和快慢指针法,并分析它们的优缺点、原理以及时间和空间复杂度。哈希表复习定义:哈希表,又称散列表,......
  • MATLAB指针表盘识别系统
    题目:MATLAB指针表盘识别系统题目类型基于颜色类的识别课题名称基于MATLAB的指示针表盘识别应用背景和思路现实中,我们知道我们肉眼所看到的彩色图像,其实都是有R、G、B三原色按照不同比例组成的,比例不同,对应的颜色就不同。同理,在利用matlab处理一些图像时候,我们往往可以利用......
  • 指针式仪表自动读数系统设计
    摘要随着模式识别技术、计算机技术等多种技术的不断完善和发展,机器视觉获得了巨大的进步与发展。目前在许多企业中,存在着大量的仪表,仪表的读数都要靠人来完成,工作量很大而且误差率相对来说比较高,基于这个原因,设计了一个工业生产线在线检测数据数字化处理系统。首先通过摄像......
  • 指针学习笔记
    变量指针地址地址是数据(变量)储存的位置,地址也是数据。存放地址的变量叫指针变量,简称指针。指针变量的大小在\(32\)位操作系统上地址用\(32\)位二进制整数表示,所以一个指针的大小为\(4\)字节;在\(64\)位操作系统上地址用\(64\)位二进制整数表示,所以一个指针的大......
  • C++八股文——内存管理(堆和栈的区别? C++内存分区? 内存泄漏?如何避免?什么是智能指针?有哪
    文章目录C++内存管理堆和栈的区别C++内存分区内存泄漏?如何避免?1、什么是内存泄露?2、内存泄漏的分类3、什么操作会导致内存泄露?4、如何防⽌内存泄露?5、智能指针有了解哪些?6、构造函数,析构函数要设为虚函数吗,为什么?什么是智能指针?有哪些种类?new和malloc有什么区别?d......
  • 为什么要有二级指针
    提示:文章文章目录前言一、背景二、2.12.2总结前言前期疑问:本文目标:一、背景之前一直疑问为什么要有二级指针,一直没有写这个帖子,今天整理了一下,收获颇丰二、2.1//增加对二级指针的使用/**这两天突然想到为什么要有二级指针,二级指针的作用是什么*我......
  • C++智能指针讨论
    一段有问题的代码。#include<iostream>intmain(){for(inti=0;i<10000000;i++){double*p=newdouble(1);}return0;}这里就有了内存泄漏。修改为下边的代码,是可以的,但是会比较占用CPU资源。#include<iostream>intmain()......
  • QT 开发循环delete指针的安全操作
    背景在做TcpSocket例子的时候,发下移除QList<QTcpSocket*>后,第二次重新连接发现出现异常。经过排查发现,原来是deleteLater与delete有区别原因分析deleteLater和delete都是在Qt中用于对象内存管理的关键方法,但它们的作用和使用时机有所不同。deleteLater用于安全异步删......
  • C++速览之智能指针
    1、存在的问题c++把内存的控制权对程序员开放,让程序显式的控制内存,这样能够快速的定位到占用的内存,完成释放的工作。但是此举经常会引发一些问题,比如忘记释放内存。由于内存没有得到及时的回收、重复利用,所以在一些c++程序中,常会遇到程序突然退出、占用内存越来越多,最后不......
  • 指针学习(3)
     目录1.字符指针变量​编辑2.数组指针变量2.1定义2.2存放3.二维数组传参的本质4.函数指针变量4.1创建4.2使用 ​编辑5.typedef关键字6.函数指针数组6.1转移表1.字符指针变量顾名思义,字符指针也就是char*,在使用中,一般简单的使用可以这样#include<stdio.h>i......