C语言 day6 | 我的日常分享

C语言 day6

指针

指针的概述

  1. 在32位系统的寻址范围是4G 0x00 00 00 00 ~ 0xff ff ff ff
  2. 内存是以字节为单位来存储数据的 系统给每个字节分配一个编号 而这个编号就是内存的地址(指针) 所以在32位系统最多只能识别4G的内存
  3. 内存的地址就是指针 指针就是地址 指针是C语言中给内存的地址起的好听高大上的名字

指针变量

  1. 指针变量:本质就是一个变量 只是这个变量存放的是内存的地址编号(指针)
  2. 在32位系统中 任何类型的地址编号都是4字节;在64位系统中 任何类型的地址编号都是8字节。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      
    #include<stdio.h>
    int main(int argc,char *argv[]){
    printf("%d\n",sizeof(char *));
    printf("%d\n",sizeof(short *));
    printf("%d\n",sizeof(int *));
    printf("%d\n",sizeof(long *));
    printf("%d\n",sizeof(float *));
    printf("%d\n",sizeof(double *));
    printf("%d\n",sizeof(double *****));
    return 0;
    }
    运行结果:4 4 4 4 4 4 4

指针变量的定义

步骤:
1、 *修饰 指针变量名
2、 保存啥类型的地址 就用该类型定义一个普通变量
3、 从上往下 整体替换
int num;&num 取num变量的空间的起始地址


指正变量使用

通过 p保存的地址空间 进行读写操作

在使用中 *p 取p所保存的地址编号 对应的空间的内容(指针变量p的解引用)


指针变量的类型

1
2
3
4
5
6
7
8
#include<stdio.h>
int main(int argc,char *argv[]){
int num=10;
int *p;
p = &num;
printf("%d\n",*p);//10
return 0;
}

问:
*p是如何取出10的?

指针变量自身的类型:

在定义中,将指针变量名拖黑 剩下啥类型 指针变量就是啥类型

指针变量所指向的类型:

在定义中,将指针变量名和离他最近的一个 * 一起拖黑 剩下啥类型 指针变量就指向啥类型



案例:指针变量取值的宽度

1
2
3
4
5
6
7
8
#include<stdio.h>
int main(int argc,char *argv[]){
int num=0x01020304;//4字节
int *p;
p = &num;
printf("%d\n",*p);
return 0;
}

num 在系统中要么是顺着存要么是倒着存,不论是顺着存还是倒着存,放心,他取出来都会自动颠倒过来,如图:

图片

指针变量取值的宽度:指针变量指向类型长度决定。

  • 这就是为什么*p能取出num的数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
int main(int argc,char *argv[]){
int num=0x01020304;//4字节
int *p;
short *p2;
char *p3;
p = &num;
p2 = &num;
p3 = &num;
printf("%#x\n",*p);
printf("%#x\n",*p2);
printf("%#x\n",*p3);
return 0;
}

运行结果:

图片

分析:

图片


指针变量的跨度

指针变量的跨度:指针变量指向类型长度决定。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
int main(int argc,char *argv[]){
int num=0x01020304;//4字节
int *p;
short *p2;
char *p3;
p = &num;
p2 = &num;
p3 = &num;
printf("p=%u\n",p);
printf("p+1=%u\n",p+1);
printf("p2=%u\n",p2);
printf("p2+1=%u\n",p2+1);
printf("p3=%u\n",p3);
printf("p3+1=%u\n",p3+1);
return 0;
}

运行结果:
图片

综合案例:
图片

1
2
3
4
5
6
7
8
#include<stdio.h>
int main(int argc,char *argv[]){
int num=0x01020304;//4字节
short *p;
p = &num;
printf("%#x",*(p+1));
return 0;
}

运行结果:
图片