C语言基础——指针

文章目录

  • 一、指针
    • 1.指针的意义
    • 2.指针类型表示
    • 3.一些操作
      • 3.1打印1个变量地址
      • 3.2通过地址查看改地址的内容以及修改改地址的内容
      • 3.3操作某个空间 -- 4个字节,给他赋值为100,只知道该空间的地址0x8000 0000
    • 4.指针变量的定义
    • 5.指针类型的大小
    • 6.指针变量的使用
      • 6.1 指针变量的初始化
      • 6.2一个指针变量对应多个普通变量
      • 6.3想通过指针对某个变量空间操作:
      • 6.4一个变量,多个指针指向该变量
      • 6.5指针类型的强转
    • 7.指针的其他应用
      • 7.1 指针变量+1,物理地址变化
      • 7.2指针与一维数组
        • 7.2.1数组名代表该数组的首地址
        • 7.2.2num和&num[0] -- 指针类型
        • 7.2.3 *num -- 代表
        • 7.2.4 *(p+1)和*p+1的区别
        • 7.2.5 *p++和++*p的区别:
        • 7.2.6扩展:数组名代表该数组的首地址,不能够进行变量++。
      • 7.3数组名和指针名:指针名可以替换数组名
      • 7.4指针与二维数组
        • 7.4.1二维数组的首地址表示
        • 7.4.2上述3种首地址表示方式他们的指针类型分别是:
        • 7.4.3获取第一行首地址
        • 7.4.4二维数组的数组名 -- 数组指针类型
      • 7.5扩展
      • 7.6指针的指针--二级指针

一、指针

指针就是地址。

1.指针的意义

地址:数据的位置。
指针是C语言提供的一种类型。

2.指针类型表示

类型 *
类型:char int float double 指针 结构体 数组
//char * – 代表这个地址里面存放的是char型数据 — 该指针指向一个char型空间
//int * – 代表这个地址里面存放的是int型数据
问题:
C语言基础——指针_第1张图片
通过强制类型转换:(int *)0x40000000 – C语言代表1个可以存放整型数据的地址
在这里插入图片描述
*地址 – 代表该地址中的内容。
int num = 10;
打印num变量的地址:%p,&num
32位CPU和系统:地址 – 0x0000 0000 ~ 0xffff ffff – 32位
64位CPU和系统:地址 – 64位

3.一些操作

3.1打印1个变量地址

&变量名 – 普通变量。
数组名 – 数组。

3.2通过地址查看改地址的内容以及修改改地址的内容

在这里插入图片描述
操作空间如下图
C语言基础——指针_第2张图片

3.3操作某个空间 – 4个字节,给他赋值为100,只知道该空间的地址0x8000 0000

*((int *)0x8000 0000) = 100;
//但是操作系统显示段错误,不允许普通用户直接修改地址的空间,基层嵌入式可以

4.指针变量的定义

类型 *标识符; – 没有赋初值,称为野指针变量。
类型 *标识符 = NULL; (习惯)
类型 *标识符 = &变量名;(习惯)

int num = 100;
定义1个指针变量指向该num空间?
int *pnum = #
pnum 代表的是本身变量的空间
*pnum 代表的是指向的空间
C语言基础——指针_第3张图片

5.指针类型的大小

指针类型的大小–32位/64位
C语言基础——指针_第4张图片
在这里插入图片描述

6.指针变量的使用

6.1 指针变量的初始化

例如:int num = 0; char ch = 0; char str[1024]=”\0”;
int *pnum = NULL;//NULL – 空 = 0
指针变量在不使用的情况下,一般初始化为NULL,否则我们称该指针为野指针。

6.2一个指针变量对应多个普通变量

//int num1=100,num2=500;
//int pnum = NULL;
//pnum指向num1 – C语言如何编写? pnum = &num1; – 可以通过
pnum 操作num1的空间。
//pnum指向num2 – C语言如何编写? pnum = &num2; – 可以通过*pnum操作num2的空间。
C语言基础——指针_第5张图片

6.3想通过指针对某个变量空间操作:

1.定义一个指针变量 int pnum = NULL;
2.把某个变量的地址赋值给指针变量 pnum = #
3.通过
指针变量名,就可以操作某个变量空间 *pnum = 1000;

6.4一个变量,多个指针指向该变量

C语言基础——指针_第6张图片

6.5指针类型的强转

和普通变量一样。(指针类型) 某个变量地址。
unsigned int num = 0x12345678;
C语言基础——指针_第7张图片
在这里插入图片描述
C语言基础——指针_第8张图片

7.指针的其他应用

7.1 指针变量+1,物理地址变化

指针变量+1,物理地址+类型大小。

7.2指针与一维数组

7.2.1数组名代表该数组的首地址

打印数组的首地址
在这里插入图片描述
C语言基础——指针_第9张图片

7.2.2num和&num[0] – 指针类型

一样:num – 整型*
num[0] – 整型*

7.2.3 *num – 代表

– 数组中第0个元素的空间 num[0]

7.2.4 (p+1)和p+1的区别

          *(p+1) 代表:地址+1 -- num[1] 

C语言基础——指针_第10张图片
p+1 = num[0]+1 = 11 – -因为优先级 > + 先执行*p,再执行+1

例1:
打印:int num[5]={10,8,6,4,2};num的内容,通过地址打印
C语言基础——指针_第11张图片
例2:
打印:int num[5]={10,8,6,4,2};num的内容,通过指针变量打印
C语言基础——指针_第12张图片

7.2.5 *p++和++*p的区别:

原因:++和的优先级相同,从右到左执行。
先执行++,再执行
p,地址+1(下面例子)
C语言基础——指针_第13张图片
先执行*p,再++,内容+1
C语言基础——指针_第14张图片

7.2.6扩展:数组名代表该数组的首地址,不能够进行变量++。

7.3数组名和指针名:指针名可以替换数组名

C语言基础——指针_第15张图片
C语言基础——指针_第16张图片

7.4指针与二维数组

指针变量与二维数组的元素之间的关系:
C语言基础——指针_第17张图片

7.4.1二维数组的首地址表示

C语言基础——指针_第18张图片
在这里插入图片描述

7.4.2上述3种首地址表示方式他们的指针类型分别是:

&num[0][0] – int * – 整型指针类型 – 第0行0列元素的地址 = int *
num – int (*)[4] – 整型数组指针类型
num[0] – int * – 整型指针类型 – 第0行的首地址 = int *
C语言基础——指针_第19张图片

7.4.3获取第一行首地址

获取第1行的首地址:
&num[1][0]
也可以:num[1]
C语言基础——指针_第20张图片
结果:num[0] num[1] num[2] – 代表了3个一维数组

在这里插入图片描述
C语言基础——指针_第21张图片

7.4.4二维数组的数组名 – 数组指针类型

C语言基础——指针_第22张图片
C语言基础——指针_第23张图片

7.5扩展

数组指针 – 代表是指针 – 用于二维数组中。
指针数组 – 代表是数组 – 指针类型的数组
C语言基础——指针_第24张图片

7.6指针的指针–二级指针

获取一个指针变量的地址?
&变量名;
定义1个指针变量,保存另外一个指针变量的地址。 — 二级指针

p – 本身变量空间
*p – 指向的空间
*(地址) – 对该地址进行寻址

你可能感兴趣的:(C语言,笔记,c语言,算法)