C语言——指针基本语法

news2024/11/15 13:30:57

概述

  • 内存地址
    • 在计算机内存中,每个存储单元都有一个唯一的地址(内存编号)。
      • 通俗理解,内存就是房间,地址就是门牌号
        在这里插入图片描述
  • 指针和指针变量
    • 指针(Pointer)是一种特殊的变量类型,它用于存储内存地址。
      • 指针的实质就是内存“地址”
  • 指针变量就是存储这个地址的变量。
    在这里插入图片描述
  • 指针作用
    • 可间接修改变量的值

指针变量的定义和使用


指针也是一种数据类型,指针变量也是一种变量

指针变量指向谁,就把谁的地址赋值给指针变量

语法格式:

类型 变量;
类型 * 指针变量 = &变量;
  • & 叫取地址,返回操作数的内存地址
    • 叫解引用,指操作指针所指向的变量的值
  • 在定义变量时,* 号表示所声明的变量为指针类型
    • 指针变量要保存某个变量的地址,指针变量的类型比这个变量的类型多一个*
  • 在指针使用时,* 号表示操作指针所指向的内存空间
    示例代码:
#include <stdio.h>

int main() {

    // 定义一个int类型的变量,同时赋值为10
    int a = 10;
    // 打印变量的地址
    printf("&a = %p\n", &a);
    // 定义一个指针变量,int *保存int的地址
    // int *代表是一种数据类型,int *指针类型,p才是变量名
    int* p;
    // 指针指向谁,就把谁的地址赋值给这个指针变量
    p = &a;
    // 打印p, *p, p指向了a的地址,*p就是a的值
    printf("p = %p, *p = %d\n", p, *p);

    return 0;
}

在这里插入图片描述

通过指针间接修改变量的值

  • 指针变量指向谁,就把谁的地址赋值给指针变量
  • 通过 *指针变量 间接修改变量的值
#include <stdio.h>

int main() {
    // 定义一个int类型变量a,同时赋值为0
    int a = 0;
    // 定义int *指针变量,同时赋值a的地址
    int *p = &a;
    // 通过指针间接修改a的值
    *p = 123;
    printf("a = %d\n", a);
    // 定义一个int类型变量b,同时赋值为5
    int b = 5;
    // p 保存 b的地址
    p = &b;
    // 通过指针间接修改a的值
    *p = 250;
    printf("b = %d\n", b);

    return 0;
}

const修饰的指针变量

  • 语法格式
int a = 1;
const int *p1 = &a;	// 等价于 int const *p1 = &a;
int * const p2 = &a;
const int * const p3 = &a;
  • 从左往右看,跳过类型,看修饰哪个字符
    • 如果是*, 说明指针指向的内存不能改变
    • 如果是指针变量,说明指针的指向不能改变,指针的值不能修改
#include <stdio.h>

int main() {
    int a = 1;
    int b = 2;
    // p1 可以改,*p1不能改
    const int *p1 = &a; // 等价于 int const *p1 = &a;
    // p1 = &b;    // ok
    // *p1 = 555;  // err

    // p2 不能修改,*p2可以修改
    int *const p2 = &a;
    // p2 = &b;    //err
    // *p2 = 555;  // ok

    // p3 和 *p 都不能改
    const int *const p3 = &a;
    // p3 = &b;    // err
    // *p3 = 555;  // err

    return 0;
}

指针大小

  • 使用sizeof()测量指针的大小,得到的总是:4或8
  • sizeof()测的是指针变量指向存储地址的大小
    • 在32位平台,所有的指针(地址)都是32位(4字节)
    • 在64位平台,所有的指针(地址)都是64位(8字节)
#include <stdio.h>

int main() {
    int *p1;
	int **p2;
	char *p3;
	char **p4;
	printf("sizeof(p1) = %llu\n", sizeof(p1));
	printf("sizeof(p2) = %llu\n", sizeof(p2));
	printf("sizeof(p3) = %llu\n", sizeof(p3));
	printf("sizeof(p4) = %llu\n", sizeof(p4));
	printf("sizeof(double *) = %llu\n", sizeof(double *));

    return 0;
}

指针步长

  • 指针步长指的是通过指针进行递增或递减操作时,指针所指向的内存地址相对于当前地址的偏移量。
  • 指针的步长取决于所指向的数据类型。
    • 指针加n等于指针地址加上 n 个 sizeof(type) 的长度
    • 指针减n等于指针地址减去 n 个 sizeof(type) 的长度
#include <stdio.h>

int main() {
    char ch;
    char *p1 = &ch;
    printf("p1:%p, p1+1: %p\n", p1, p1 + 1); // 步长为1字节

    int a;
    int *p2 = &a;
    printf("p2:%p, p2+1: %p\n", p2, p2 + 1); // 步长为4字节

    double d;
    double *p3 = &d;
    printf("p3:%p, p3+1: %p\n", p3, p3 + 1); // 步长为8字节

    return 0;
}

野指针和空指针

  • 指针变量也是变量,是变量就可以任意赋值
  • 任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针
    • 此指针指向的区域是未知(操作系统不允许操作此指针指向的内存区域)
  • 野指针不会直接引发错误,操作野指针指向的内存区域才会出问题
  • 为了标志某个指针变量没有任何指向,可赋值为NULL
    • NULL是一个值为0的宏常量
#include <stdio.h>

int main() {
    int *p;
    p = 0x12345678; // 给指针变量p赋值,p为野指针, ok,不会有问题,但没有意义
    // *p = 1000;      // 操作野指针指向未知区域,内存出问题,err
    printf("111111111111111111\n");

    int *q = NULL;  // 空指针

    return 0;
}

多级指针

  • C语言允许有多级指针存在,在实际的程序中一级指针最常用,其次是二级指针。
  • 二级指针就是指向一个一级指针变量地址的指针。
#include <stdio.h>

int main() {
    int a = 10;
    int *p = &a; // 一级指针
    *p = 100;    //*p就是a

    int **q = &p;
    // *q就是p
    // **q就是a

    int ***t = &q;
    // *t就是q
    // **t就是p
    // ***t就是a
    printf("%d, %d, %d\n", *p, **q, ***t);

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/963933.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

46、SpringBoot输入校验--JSR 303

★ Spring Boot的输入校验 springboot支持两种校验方式&#xff1a;1. Spring原生提供的 Validation&#xff0c;这种验证方式需要开发者手写验证代码&#xff0c;比较繁琐。就是普通的if判断2. 使用JSR 303的校验&#xff0c;这种验证方式只需使用注解、即可以声明式的方式进…

封装(个人学习笔记黑马学习)

1、格式 #include <iostream> using namespace std;const double PI 3.14;//设计一个圆类&#xff0c;求圆的周长 class Circle {//访问权限//公共权限 public://属性//半径int m_r;//行为//获取圆的周长double calculateZC() {return 2 * PI * m_r;} };int main() {//通…

MBA/MEM联考已经过了“蛮干”的时间段了……

如果MBA/MEM备考存在有效的方式&#xff0c;倾注时间一定是最靠谱的&#xff01;如果要靠谱的一点的方式&#xff0c;那就是大量的倾注时间&#xff01;可问题目前已经没有“大量”的时间可以用了&#xff0c;因为对于在职考生而言&#xff0c;最难得得也恰恰就是时间&#xff…

软件总体部署:Total Software Deployment Crack

TNI 6.1&#xff1a;数据传输模式的新界面和功能 根据您向支持团队提供的反馈&#xff0c;我们对“数据传输”窗口的机制和界面进行了重大重新设计。 概述 远程和自动化软件部署 全面软件部署&#xff1a;企业网络的托管软件部署。 远程和自动化软件部署 Total Software Deplo…

碳中和数据合集(含上市公司碳排放、碳减排、排污费、环境税等数据)1990-2022年

数据简介&#xff1a;“推动企业形成绿色生产方式和生活方式”“支持有条件的地方和重点行业、重点企业率先达到碳排放峰值”。可见&#xff0c;企业已成为应对气候变化、推动低碳转型、助力“双碳”目标实现的主力军&#xff0c;推动其绿色、低碳化转型已成为未来经济发展的必…

OpenCV(十三):图像中绘制直线、圆形、椭圆形、矩形、多边形和文字

目录 1.绘制直线line() 2.绘制圆形circle() 3.绘制椭圆形ellipse() 4.绘制矩形rectangle() 5.绘制多边形 fillPoly() 6.绘制文字putText() 7.例子 1.绘制直线line() CV_EXPORTS_W void line(InputOutputArray img,Point pt1, Point pt2,const Scalar& color,int t…

“宽带中国”城市试点与专利匹配数据,做一个多期DID(2010-2021)

数据简介&#xff1a;人类正在经历以互联网为基础的第三次技术革命&#xff0c;作为以“互联网”为底层基础的数字经济&#xff0c;以5G、人工智能和大数据中心为代表的数字基础设施建设和普惠宽带网络基础设施建设成为数字经济可持续发展的动力。工业和信息化部、国家发展和改…

uniapp小程序单页面改变手机电量,头部通知的颜色效果demo(整理)

onShow(){ // 改变电池的颜色 wx.setNavigationBarColor({ frontColor: ‘#ffffff’, //只支持两种颜色 backgroundColor: ‘#ffffff’, animation: { duration: 1 } }) }

个微API接口开发

请求URL&#xff1a; http://域名地址/sendText 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wId是string登录实例标识wcId是string接收…

常见链表的操作题+代码

文章目录 leetcode 2 两数相加leetcode 19删除链表中的倒数第N个节点leetcode 21合并两个有序链表leetcode 24两两交换链表中的节点leetcode 25k个一组链表反转leetcode 61旋转链表 leetcode 2 两数相加 两个链表对应的值进行相加&#xff0c;如何计算呢&#xff1f; 考虑点&…

2.3 数据模型

思维导图&#xff1a; 前言&#xff1a; 我的理解&#xff1a; 这段话介绍了概念模型和数据模型之间的关系&#xff0c;以及数据模型的定义和重要性。具体解读如下&#xff1a; 1. **概念模型**&#xff1a;它是一种描述现实世界数据关系的抽象模型&#xff0c;不依赖于任何…

unity 场景烘培(边学习,边记录)

前言&#xff1a;好记性不如烂笔头&#xff0c;本文只提供参考&#xff01; 问题总结&#xff1a;1.unity 场景烘焙问题之模型UV有重叠_野区捕龙为宠的博客-CSDN博客 一、光源种类&#xff08;摘录&#xff1a;Unity灯光&#xff08;light&#xff09;_浮影℡的博客-CSDN博客…

Win10搭建VisualSvn Server

Win10搭建VisualSvn Server 目录 Win10搭建VisualSvn Server一、下载VisualSvn Server安装包二、安装VisualSvn Server三、配置和使用VisualSVN Server四、添加用户及权限设定方法五、创建目录及配置权限 1、服务端&#xff1a;有集成了Subversion和Apache、安装使用非常简单且…

软件第三方验收测评介绍

软件第三方验收测试 软件项目验收测试介绍&#xff1a; 软件项目验收测试是部署软件之前的最后一个测试操作&#xff0c;是对系统进行全面的测试&#xff0c;以验证其是否符合合同要求&#xff0c;出具第三方测试报告&#xff0c;为系统验收提供依据。 验收测试的目的是&…

【Ambari】Python调用Rest API 获取集群状态信息并发送钉钉告警

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的帮助&#x1f338;文…

RFA01无线麦克风无线音频模块

1、简介 RFA01无线麦克风模块&#xff0c; 是一款支持2.4G私有协议无线麦克风、无线音频模块&#xff0c;支持秒连、低延时、低功耗、高音质的特性。支持串口AT指令&#xff0c;支持外挂PA射频放大器。主从之间可实现数据的传输功能。 2、模块实物图片 3、模块功能说明 4、模块…

python 深度学习 解决遇到的报错问题3

目录 一、AttributeError: The vocab attribute was removed from KeyedVector in Gensim 4.0.0. 二、ImportError: cannot import name logsumexp 三、FutureWarning: Passing (type, 1) or 1type as a synonym of type is deprecated; in a future version of numpy, it w…

【Interaction交互模块】ActionPublisher/ActionReciever

文章目录 需求案例原理0、相应准备1、发布器、接收器2、将把两者联系起来3、前提状态 补充 需求 Interactor只能将一个动作&#xff08;如按下手柄抓取键&#xff09;&#xff0c;传递给Interactble,如果要传两个或多个&#xff0c;就需要用发布器和接收器。 案例 右手柄抓取…

常见网络通信协议(http、https、ws)及安全协议(SSL、TLS、XTLS)

文章内容删除了一大半不合适的内容&#xff0c;发不出来&#xff0c;你懂得。&#x1f970; 一、常见网络通信协议1.1、HTTP 协议1.11 HTTP 协议简介1.12 HTTP 协议的工作流程1.13 HTTP 协议的常用方法1.14 HTTP 协议的常见状态码1.15 HTTP 的缺点 1.2 HTTPS 协议1.21 HTTPS 协…

生态系统模型Biome-BGC、InVEST模型、PLUS模型、SolVES模型、CENTURY模型、CASA模型、生态系统NPP等应用

目录 一、Biome-BGC介绍 二、Linux应用、CDO工具应用、Python应用 三、数据处理实践 四、单点的模拟 五、区域模拟-1 六、区域模拟-2 七、长时间序列模拟案例实践 更多应用 在Biome-BGC模型中&#xff0c;对于碳的生物量积累&#xff0c;采用光合酶促反应机理模型计算…