c语言指针(完)
内容概要
一、指针的基本用法
二、指针的工作原理
三、注意的问题
1、指针的基本用法
#include <stdio.h> int main(){ int *pa; //定义整形指针变量,指针只能是其它整形变量的内存地址 int num = 10; pa = # //&获取整形变量的内存地址,将它赋值给pa指针变量作为指针 printf("%p, %p, %d", &pa, pa ,*pa); //获取指针变量的内存地址;获取指针变量存储的指针;获取指针对应变量的值 return 0; }
2、指针工作的原理
在了解指针的工作原理之前,必须先了解C语言是如何在内存中存储数据的
指针变量存储的值是其它变量的内存地址,也就是指针;指针变量类型必须和指针对应的变量的类型一致,虽然指针变量的类型不同,但是存储的指针的数据长度是一样的,可以把指针看作是一种数据类型
指针实现了c语言的间接访问变量
-与python不同的是,python中先创建值,在将值的内存地址赋值给变量
第一步:现在内存中创建变量值10
第二步:将值10的内存地址存放给变量A
第三步:再在内存中创建11
第四步:将值11的内存地址赋值给变量A(值10由于引用计数为0,会被python中垃圾回收线程回收,实际上因为小整数池的缘故这个例子只是例子)
a = 10 print(id(a)) a = 11 print(id(a)) # 结果发现两次a的存储得内存地址不同(id不是内存地址,它是区别内存地址的标识)
-c语言中变量
#include <stdio.h> int main(){ int a = 10; printf("a address is %p\n",&a); a = 11 printf("a address is %p\n",&a); return 0; } // 两次地址是一致的
#include <stdio.h> int main(){ int a,b = 10; printf("a address is %p\n",&a); printf("b address is %p\n",&a); return 0; } // 不同变量存储了相同值,这在python中是不会出现的
is判断的其实是变量对应的值的内存地址是否一致,python中的变量的原理就类似于c语言中的指针
a = 10 b = 10 print(a is b)
3、注意的问题
尝试直接用字符指针,存储字符串
#include <stdio.h> int main(void){ char *pa = "hello world"; return 0; }
运行成功,但是有警告
scanf与指针
#include <stdio.h> int main(void){ char *pa = NULL; printf("please input a pharse:"); scanf("%s", p); return 0; }
这样是不可以运行的
切记不要对未初始化指针的指针变量赋值
#include <stdio.h> int main(){ int *pa; printf("pa address is %p\n",&pa); printf("pa value is %lld\n",*pa); // *pa = 222; return 0; }
因为定义的指针变量有默认值,这个指针可能指向系统关键代码,直接复制,将会把关键代码替换掉
指针必须是其它数据的内存地址(可以是变量,可以是字符串常量,可以是数组,可以是函数等等),拿到地址还不够,想要通过指针间接引用数据和功能,必须告诉指针它所指向的数据的格式,这样编译
器在解引用时才知道如何使用得到的值(数组指针,数组函数。。。)
***完***
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构