【C语言】_指针变量

目录

[1. 指针变量的含义](#1. 指针变量的含义)

[2. 指针变量的类型](#2. 指针变量的类型)

[3. 指针变量的大小](#3. 指针变量的大小)

[4. 指针变量的解引用/间接访问](#4. 指针变量的解引用/间接访问)

[5. 指针变量的类型](#5. 指针变量的类型)

[5.1 指针类型与解引用](#5.1 指针类型与解引用)

[5.2 指针类型与加减整数操作](#5.2 指针类型与加减整数操作)

[5.3 关于泛型指针void*](#5.3 关于泛型指针void*)

[5.3.1 void*类型指针可接收任意类型的地址](#5.3.1 void*类型指针可接收任意类型的地址)

[5.3.2 void*类型指针不能直接进行指针的+-整数和解引用的运算](#5.3.2 void*类型指针不能直接进行指针的+-整数和解引用的运算)


关于内存地址:

1、 指针是内存中一个存储单元的编号,即地址:

注:&是取地址操作符,为单目操作符;

2、 指针通常是指指针变量,是用来存放内存地址的变量;

1. 指针变量的含义

通过取地址操作符&,取出某变量在内存中的地址,并存放到另一变量中,该变量就是指针变量;

即:存放地址的变量称为指针变量;

cpp 复制代码
int a = 10;
//在内存中为a申请4字节空间
int* pa = &a;
//取出第一个字节的地址存放到pa变量中,pa就是指针变量

注:取多字节变量的地址,取出的是该变量最低字节的地址。

此时存放a的地址的变量是pa,pa变量的类型是指针变量;

2. 指针变量的类型

对于上例,指针变量pa的类型为int*,其含义包含两重:

1、int表示pa指向的对象(a)是int类型;

2、*表示pa是指针变量;

3. 指针变量的大小

(1)x86(32位):

(2)x64(64位):

对于虚拟地址空间不同的系统,指针变量的大小也有所不同:

32位虚拟地址空间需要32 bit位地址(4 B),64位虚拟地址空间需要64 bit位地址(8 B);

故指针的大小在32位平台是4个字节,在64位平台是8个字节。

4. 指针变量的解引用/间接访问

cpp 复制代码
int main() {
	int a = 10;
	int* pa = &a;
	printf("%d\n", *pa);
	*pa = 0;
	printf("%d\n", *pa);
    return 0;
}

运行结果如下:

可见:*pa=0实现了a变量的置0操作,即:指针变量解引用即可获得该指针变量指向的对象;

5. 指针变量的类型

指针类型表示该指针变量指向的变量的类型,如int* p1表示p1指向的变量类型为int型,char* p2表示p2指向的变量类型为char型,从而影响了指针类型解引用与加减操作的实现:

5.1 指针类型与解引用

(1)int*:

(2)char*:

执行*pa=0后:*pa在内存中被修改为 00 00 00 00(存储a的4B内存空间全部被置0),

执行*pc=0后:*pc在内存中被修改为 00 33 22 11(仅存储a的最低1B内存空间被置0);

整形指针(int*)解引用可以访问4B,字符指针(char*)解引用可以访问1B。

即:指针类型决定了指针解引用时访问的权限;

5.2 指针类型与加减整数操作

cpp 复制代码
int main() {
	int a = 0x11223344;
	int* pi = &a;
	char* pc = &a;
	printf("pi   = %p\n", pi);
	printf("pi+1 = %p\n", pi + 1);
	printf("---------------\n");
	printf("pc   = %p\n", pc);
	printf("pc+1 = %p\n", pc + 1);
	return 0;
}

运行结果如下:

即:指针类型决定了指针进行+z/-z的步长(向前和向后走一步的距离);

int* :+n = + n * sizeof(int);

char*:+n = + n * sizeof(char);

图示如下:

5.3 关于泛型指针void*

在指针类型中有一种特殊的指针类型:void*,通常称之为无具体类型的指针或泛型指针。

5.3.1 void*类型指针可接收任意类型的地址

代码示例1:使用不对应类型的指针变量接收某一变量地址:

可见报错:类型不兼容

代码示例2:使用void*类型指针变量接收不同类型变量地址:

可见未报错,void*可接收任何类型的变量地址;

5.3.2 void*类型指针不能直接进行指针的+-整数和解引用的运算

对void*类型的指针变量解引用,无法确定其访问权限,报错为非法的间接寻址;

通常,void*类型的指针使用在函数参数部分,用于接收不同类型数据的地址,以实现泛型编程的效果;

相关推荐
白帽攻防录6 小时前
SRC 挖洞:PostScript 打印机驱动双 RCE,打印服务器怎么变成内网跳板
开发语言·网络安全·php·内网安全
十年Java程序媛6 小时前
Java枚举Enum完整教程|替代静态常量,开发与面试要点
java·开发语言·spring boot·后端·面试
2603_965148116 小时前
电商选品调研:通过关键词搜索API获取市场热销商品,结合商品详情API分析竞品卖点与定价
开发语言·数据库·人工智能·python·信息可视化
xixiaoyunya7 小时前
Python 异步编程入门:用 asyncio 轻松实现并发任务
开发语言·python·php
学逆向的7 小时前
C 循环结构的执行效率分析
c语言·开发语言·数据结构·网络安全
小坏讲微服务8 小时前
刚发布一个月的JDK 27,为什么我建议你立刻升级?
java·开发语言·spring boot·spring·架构·求职招聘·springboot4
打工仔折腾 AI9 小时前
用 Dashlet 把极空间 NAS 服务入口整理成统一导航首页的实践
java·开发语言·人工智能·后端·python·rpc·ai agent 实战
MATLAB代码顾问9 小时前
Simulink PI 参数扫描与批量仿真完整 MATLAB 代码
开发语言·matlab
Want59510 小时前
Python跳动的爱心②
开发语言·python·数学建模
Navigator_Z10 小时前
LeetCode //C - 1293. Shortest Path in a Grid with Obstacles Elimination
c语言·算法·leetcode