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。
相关推荐
Zenova EdgeOS2 小时前
Go 工业边缘错误处理实战:用 errors 构建可追溯错误链
开发语言·数据库·golang
取名真是2 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
FRing033 小时前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
Fatbobman(东坡肘子)4 小时前
快速消失的硬盘容量 -- 肘子的 Swift 周报 #160
开发语言·人工智能·redis·ios·swiftui·iphone·swift
揽星河..4 小时前
【C语言】底层程序设计
c语言·开发语言
JavaPub-rodert4 小时前
从零搭建通用管理后台:ShiyuAdmin 的 Go、React 与 RBAC 实践
开发语言·react.js·golang
海的透彻5 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言
code2cat5 小时前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle
北京中科新远科技5 小时前
高速交换机端口预算怎么做?下行、上联、拆分和冗余计算框架
开发语言·php
xiaoye-duck6 小时前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(下):流式响应实现和测试
开发语言·网络·c++·语言模型