指针(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));
复制代码

 

posted @   李义山的诗  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示