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
相关推荐
灰子学技术21 小时前
go response.Body.close()导致连接异常处理
开发语言·后端·golang
二十雨辰21 小时前
[python]-AI大模型
开发语言·人工智能·python
Yvonne爱编码1 天前
JAVA数据结构 DAY6-栈和队列
java·开发语言·数据结构·python
Re.不晚1 天前
JAVA进阶之路——无奖问答挑战1
java·开发语言
你这个代码我看不懂1 天前
@ConditionalOnProperty不直接使用松绑定规则
java·开发语言
pas1361 天前
41-parse的实现原理&有限状态机
开发语言·前端·javascript
琹箐1 天前
最大堆和最小堆 实现思路
java·开发语言·算法
Monly211 天前
Java:修改打包配置文件
java·开发语言
我命由我123451 天前
Android 广播 - 静态注册与动态注册对广播接收器实例创建的影响
android·java·开发语言·java-ee·android studio·android-studio·android runtime
island13141 天前
CANN ops-nn 算子库深度解析:核心算子(如激活函数、归一化)的数值精度控制与内存高效实现
开发语言·人工智能·神经网络