C语言之指针入门

文章目录

  • 指针入门
    • [1. 基本介绍](#1. 基本介绍)
    • [2. 指针应用案例](#2. 指针应用案例)

指针入门

1. 基本介绍

  • 简单的说 指针表示一个地址(存放的是地址),举例说明:
c 复制代码
#include<stdio.h>

void main(){
	int num = 1;
	//num的地址是多少
	//1.如果要输出一个变量的地址,使用格式:%p
	//2.&num表示取出num这个变量的地址
	printf("num的值=%d num的地址=%p",num,&num);
	getchar();
}
c 复制代码
    // 1.int * 表示类型为 指针类型(指向一个int类型的指针)
	// 2.名称 ptr ,ptr就是一个 int * 类型
	// 3.ptr指向了一个int类型的变量地址
	int *ptr = &num;

	//指针变量,本身也有地址
	printf("ptr的地址是%p",&ptr);

	printf("num的值=%d num的地址=%p",num,&num)
  • ptr是通过本身存放的一个地址指向了另外一个变量的地址
c 复制代码
printf("\n ptr的地址是%p ptr存放的值是一个地址为%p",&ptr,ptr);
  • ptr 存放的地址其实就是 num 变量的地址
  • 指针变量,存放的地址 ptr
  • 获取指针指向的值 *ptr
c 复制代码
printf("\n num的值=%d num的地址=%p ptr指向的值=%d",num,&num,*ptr);

2. 指针应用案例

  • 写一个程序,获取一个 int 变量 num 的地址,并显示到终端将 num 的地址赋给指针 ptr , 并通过 ptr 去修改 num的值.并画出案例的内存布局图。
  1. 代码实现
c 复制代码
#include <stdio.h>

int main() {
    // 1. 定义一个 int 变量 num
    int num = 10;
    
    // 2. 定义一个指向 int 的指针 ptr,并获取 num 的地址赋给它
    int *ptr = &num;

    // 打印初始状态
    printf("修改前:\n");
    printf("num 的值: %d\n", num);
    printf("num 的地址 (&num): %p\n", (void*)&num);
    printf("ptr 存储的地址: %p\n\n", (void*)ptr);

    // 3. 通过指针 ptr 修改 num 的值
    *ptr = 100;

    // 打印修改后的状态
    printf("修改后:\n");
    printf("num 的值 (通过 *ptr 修改后): %d\n", num);
    printf("*ptr 的值: %d\n", *ptr);

    return 0;
}
  1. 内存布局图解

在内存中,变量 num 占用一块空间,而指针 ptr 占用另一块空间,其内容是 num 的起始地址。

  • 详细布局说明:
变量名 内存地址 (示例) 存储的内容 说明
num 0x7ffee1234568 100 存储实际的整数值
ptr 0x7ffee1234570 0x7ffee1234568 存储了 num 的内存地址

关键点总结:

  • &num:取址符,获取变量在内存中的"门牌号"。
  • int \*ptr:声明一个指针变量,专门用来装"门牌号"。
  • \*ptr :解引用符,代表"前往 ptr 指向的地址,并操作那里的内容"。

  1. 核心原理解析

    1. 关联阶段 :执行 ptr = # 后,指针 ptr 指向了 num 所在的内存单元。
    2. 间接访问阶段 :执行 *ptr = 100; 时,CPU 不直接去改 num,而是先查看 ptr 里存的地址,然后顺着这个地址找到 num 的内存位置,将其中的数值从 10 覆盖为 100
相关推荐
ada7_19 小时前
LeetCode(python)78.子集
开发语言·数据结构·python·算法·leetcode·职场和发展
leoufung19 小时前
LeetCode 97. 交错字符串 - 二维DP经典题解(C语言实现)
c语言·算法·leetcode
nbsaas-boot20 小时前
Go 项目中如何正确升级第三方依赖(Go Modules 实战指南)
开发语言·后端·golang
wadesir20 小时前
C++基本数据类型详解(零基础掌握C++核心数据类型)
java·开发语言·c++
skywalk816321 小时前
wow文件处理trinitycore的文件处理
开发语言·游戏
一路往蓝-Anbo1 天前
STM32单线串口通讯实战(五):RTOS架构 —— 线程安全与零拷贝设计
c语言·开发语言·stm32·单片机·嵌入式硬件·观察者模式·链表
今天也好累1 天前
C语言安全格式化:snprintf核心指南
c语言·笔记·学习·visual studio
leiming61 天前
c++ map容器
开发语言·c++·算法
坚持就完事了1 天前
JavaScript
开发语言·javascript·ecmascript