指针(1)
内存地址
-
字节:字节是内存的容量单位,英文称为 byte,一个字节有8位,即 1byte = 8bits
-
地址:系统为了便于区分每一个字节而
-
单字节数据:对于单字节数据而言,其地址就是其字节编号。
-
多字节数据:对于多字节数据而言,期地址是其所有字节中编号最小的那个,称为基地址。
对它们逐一进行的编号,称为内存地址,简称地址,系统通过对应的内存地址从而定位内存的位置
-
-
取址符
-
每个变量都是一块内存,都可以通过取址符 & 获取其地址
-
例如:
1 2 3 4 5 6 7 8 | int a = 100; printf( "整型变量 a 的地址是: %p\n" , &a); char c = 'x' ; printf( "字符变量 c 的地址是: %p\n" , &c); double f = 3.14; printf( "浮点变量 f 的地址是: %p\n" , &f); |
-
虽然不同的变量的尺寸是不同的,但是他们的地址的尺寸确实一样的,在32位系统为4字节,64位系统为8字节
不同的地址虽然形式上看起来是一样的,但由于他们代表的内存尺寸和类型都不同,因此它们在逻辑上是严格区分的。
指针基础
-
-
一个专门用来存放内存地址的变量,指针也就是指针变量
-
-
地址。比如 &a 是一个地址,也是一个指针,&a 指向变量 a
-
专门用于存储地址的变量,又称指针变量
-
-
-
-
类型 *指针变量名
-
解释:
-
“类型” : 指针变量指向的内存空间存放的数据类型
-
“指向” : 如果我保存了你的地址,那么就说我指向你
-
“*” :定义指针变量的固定格式
-
-
-
// 系统中给a申请了4个字节的内存空间 int a = 10; printf("a addr:%p\n",&a); // 定义一个指针变量用于存放a的地址 int *p = &a; // 第一部分:*p :首先p是一个变量,占用内存8个字节,存放了a的地址 // 第二部分:int 指的是指针变量所指向的内存空间放了什么类型的数据 printf("p的值:%p addr : %p\n",p,&p); printf("a的值:%d addr : %p\n",a,&a);
指针的定义
// 用于存储 int 型数据的地址,p1 被称为 int 型指针,或称整型指针 int *p1; // 用于存储 char 型数据的地址,p2 被称为 char 型指针,或称字符指针 char *p2; // 用于存储double型数据的地址,p3 被称为 double 型指针 double *p3;
指针的赋值
赋给指针的地址,类型需跟指针的类型相匹配。
int a = 100; p1 = &a; // 将一个整型地址,赋值给整型指针p1 char c = 'x'; p2 = &c; // 将一个字符地址,赋值给字符指针p2 double f = 3.14; p3 = &f; // 将一个浮点地址,赋值给浮点指针p3
指针的索引
通过指针,取得其指向的目标
*p1 = 200; // 将 p1 指向的目标(即a)修改为200,等价于 a = 200; *p2 = 'y'; // 将 p2 指向的目标(即c)修改为'y',等价于 c = 'y'; *p3 = 6.6; // 将 p3 指向的目标(即f)修改为6.6,等价于 f = 6.6;
int a = 10; // 定义指针p指向a int *p = &a; printf("%p,%p\n",&a,p); // 通过p将a的内容输出 int data = *p; printf("%d\n",data); char buf[] = "jack"; char *ptr = buf; //&buf[0]; printf("%s\n",buf); printf("%s\n",ptr); return 0;
指针的尺寸
-
-
指针所占内存,取决于地址的长度,而地址的长度则取决于系统寻址范围,即字长
-
结论:指针尺寸只跟系统的字长有关,跟具体的指针的类型无关
-
在32位系统,指针的大小占用4字节
-
在64位系统,指针的大小占用8字节
// 指针大小 int a = 10; char b = 'c'; float c = 85.5; char *p1 = &b; int *p2 = &a; float *p3 = &c; printf("p1 size : %ld\n",sizeof(p1)); printf("p2 size : %ld\n",sizeof(p2)); printf("p3 size : %ld\n",sizeof(p3));
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?