C语言--关于指针和解引用的几个知识点

本文详细解释了指针的概念及其在计算机内存中的作用,并探讨了指针类型的重要性、指针运算的基本规则及特殊情况下指针的使用规范。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.什么是指针?

指针是编程语言中的一个对象,利用地址,他的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。指针形式由type和*决定。

2.为什么要存在指针

存在指针是为了更方便的定位内存中的某个位置,利于操作。

3.下面澄清几个名词

指针为地址,其大小由电脑是几位决定的。指针大小在32位平台上是4个字节;在64位上是8个字节。

指针变量为变量,指针相当于对变量作一个修饰限定。

变量指针为变量的指针,这里变量相当于一个修饰限定,指针为主语,所以指针变量本质为指针。

4.32位电脑和64位电脑产生地址的不同

对于32位的机器,有32根地址线,假设每根地址线在寻址的是产生一个电信号(0或者1),那么32根地址线产生的地址会是2的32次方个地址,每个人地址标示一个字节,那我们就可以给4G空间进行编址。64位机器与32位原理相同,得到4G*4G的空间进行编址。

5.指针类型决定性作用

指针的类型决定了看问题是应该分配几个字节,同时也决定了解引用时能操作几个字节。如p+1,若p位int型则+1向后走4个字节,而若p为char型+1向后走1个字节

6.对于二级以上的指针+1都为字节+4(因为存放的是一级指针的地址,而一级指针占4个字节(32位电脑))

7.关于左值和右值

做左值时使用其空间,做右值时使用其内容。

8.指针运算

通常若两指针指向同一数组(字符串),则两指针相减代表两指针间的元素个数(有正负大小之分)。如若定义一个整型数组a[10],则a[6]-a[4]为1而a[4]-a[6]为-1。

9.标准规定

允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。

### C语言指针知识点详解 #### 1. 基本概念 指针是一种特殊的变量,用于存储另一个变量的内存地址。通过指针可以直接访问修改该地址上的数据[^1]。 #### 2. 定义与初始化 指针的定义需要指定其所指向的数据类型,以确保编译器能够正确处理指针对应的数据。例如: ```c int a = 5; int *pa = &a; // pa 是一个指向 int 类型的指针,并被初始化为变量 a 的地址 ``` #### 3. 地址运算符 `&` 和解引用运算符 `*` - 运算符 `&` 返回某个变量的地址。 - 运算符 `*` 对指针进行解引用操作,获取它所指向的内容。 示例代码如下: ```c #include <stdio.h> int main() { int b = 10; int *pb = &b; printf("Address of b: %p\n", &b); // 打印变量 b 的地址 printf("Value stored at pb: %p\n", pb); // 打印指针 pb 中保存的地址 printf("Dereferenced value: %d\n", *pb); // 打印指针 pb 指向的内容 return 0; } ``` #### 4. 多级指针 多级指针是指指向另一指针指针。例如,二级指针是用来存放一级指针地址的变量[^2]。以下是一个关于二级指针的例子: ```c #include <stdio.h> int main() { int c = 15; int *pc = &c; // pc 是指向 int 的指针 int **ppc = &pc; // ppc 是指向指针 pc 的指针 printf("Value of c: %d\n", c); // 直接打印变量 c 的值 printf("Dereference via pc: %d\n", *pc); // 通过一级指针访问 c 的值 printf("Dereference via ppc: %d\n", **ppc); // 通过二级指针访问 c 的值 return 0; } ``` #### 5. 函数参数中的指针传递 当函数接受指针作为参数时,可以通过间接方式修改调用者传入的实际参数。例如: ```c void increment(int *ptr) { (*ptr)++; } int main() { int d = 20; increment(&d); printf("After incrementing: %d\n", d); // 输出 21 return 0; } ``` #### 6. 函数指针 函数指针可以用来存储函数的入口地址,从而实现动态调用功能[^1]。例如: ```c #include <stdio.h> int add(int x, int y) { return x + y; } int subtract(int x, int y) { return x - y; } int main() { int (*operation)(int, int); operation = add; printf("Result of addition: %d\n", operation(5, 3)); // 调用加法函数 operation = subtract; printf("Result of subtraction: %d\n", operation(5, 3)); // 调用减法函数 return 0; } ``` #### 7. 结构体指针 结构体指针允许我们更方便地访问复杂数据类型的成员。使用箭头运算符 (`->`) 可以简化对结构体内成员的操作[^3]。例如: ```c typedef struct student { char name[21]; int age; } Student, *StudentPtr; int main() { Student s = {"Alice", 20}; StudentPtr ptr = &s; printf("Name: %s, Age: %d\n", ptr->name, ptr->age); // 使用 -> 访问成员 return 0; } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值