C语言指针的使用

简介: C语言指针的使用

前言

一、指针基本概念介绍

在 C 语言中,指针是一种用于存储内存地址的数据类型。指针可以存储任何数据类型的内存地址,包括基本数据类型、数组、结构体、函数等。通过指针,可以实现对内存中某个位置的直接访问和修改,这是 C 语言中很多高级特性的实现基础。

在定义指针变量时,需要指定指针变量所指向的数据类型。语法格式如下:

type *ptr;

其中 type 是指针变量所指向的数据类型,* 表示这是一个指针类型的变量,ptr 是指针变量的名称。例如,以下代码定义了一个指向整型数据的指针变量:

int *p;

指针变量在初始化之前,通常会被赋予 NULL 或者 0 这样的无效地址。指针变量可以通过取地址符 & 来获取某个变量的内存地址。例如,以下代码获取了整型变量 num 的内存地址,并将其赋给指针变量 p:

int num = 10;
int *p = # // p 中保存 num 的内存地址

二、指针的大小

在C语言中,指针的大小与它所指向的数据类型有关。由于不同类型所占据的空间大小是不同的,指向不同类型的指针也会有不同的大小。

在32位的系统中,指针的大小通常是4个字节,即32位;在64位的系统中,指针的大小通常是8个字节,即64位。但是,这仅仅是指针变量本身所占据的空间大小,指针所指向的实际数据类型的大小并不一定相同。

例如,以下代码分别定义了指向不同类型数据的指针:

int *p_int;
char *p_char;
float *p_float;

在大多数编译器实现中,这些指针变量都占据 4 个字节(32位系统)或 8 个字节(64位系统)的空间。但是,这些指针所指向的实际数据类型占据的空间是不同的。int 类型通常占据 4 个字节,char 类型通常占据 1 个字节,float 类型通常占据 4 个字节。因此,在通过这些指针来访问内存中的数据时,每种类型需要根据它所占据的空间数来确定访问的字节数。

另外,需要注意的是函数指针的大小,函数指针与普通指针的大小并不相同。函数指针(指向函数的指针)的大小取决于系统的架构和指针实现的细节。

总的来说,指针的大小取决于系统的位数和指针所指向的数据类型。对于特定的系统和编译器,可以使用 sizeof 运算符来计算指针的大小。

在x86中指针大小运算结果:

在x64中指针大小运算结果:

三、使用指针访问变量和变量地址

在 C 语言中,使用指针可以访问变量的值和内存地址。

访问变量的值可以通过指针运算符 * 来实现。例如,以下代码定义了一个整型变量 num 和一个指向 num 的指针变量 p,并使用指针变量 p 访问 num 的值:

int num = 10;
int *p = # // p 中保存 num 的内存地址
int value = *p; // value 等于 num 的值,也就是 10

在这个例子中,使用取地址符 & 来获取 num 变量的内存地址,并将其赋给指针变量 p。然后,使用指针运算符 * 访问 p 指向的内存地址中存储的值,即 num 变量的值。

访问变量的内存地址可以直接使用取地址符 &。例如,以下代码访问 num 变量的内存地址,并将其打印出来:

int num = 10;
int *p = # // p 中保存 num 的内存地址
printf("%p", &num); // 打印 num 的内存地址

在这个例子中,printf 函数使用 %p 格式化字符串打印 num 变量的内存地址,使用取地址符 & 获取了 num 变量的内存地址。


四、使用指针遍历数组

指针可以用来遍历数组,可以直接通过指针来访问数组元素的值。

以下是一个使用指针遍历数组的示例代码:

int arr[5] = {1, 2, 3, 4, 5};
int *p = arr; // p 指向数组的第一个元素
for (int i = 0; i < 5; i++) {
    printf("%d ", *(p + i));
}

在这个示例中,数组 arr 包含了5个整型元素,定义了一个指针变量 p 指向数组的第一个元素。使用 for 循环遍历了数组中的所有元素,在每一次循环中,通过指针 p 加上偏移量 i 来访问数组的每一个元素的值,即 *(p + i)。

需要注意的是,在使用指针遍历数组时,指针的类型必须匹配数组元素的类型,否则会导致访问内存时出现错误。另外,指针变量 p 中并不存储数组的长度信息,因此在进行指针遍历时需要保证不越界。

也可以使用指针或者下标来访问数组元素的值。介绍一下使用 p[i] 的方式来遍历数组。

p[i] 和 *(p + i) 是等价的方式,都是通过指针偏移量来访问数组元素的值。例如,以下代码使用 p[i] 的方式遍历数组:

int arr[5] = {1, 2, 3, 4, 5};
int *p = arr; // p 指向数组的第一个元素
for (int i = 0; i < 5; i++) {
    printf("%d ", p[i]); // 使用 p[i] 的方式访问数组元素的值
}

在这个示例中,与使用指针和偏移量计算元素地址访问数组元素的方式不同,使用 p[i] 的方式直接使用下标 i 来访问数组中的元素。p[i] 实际上等价于 *(p + i)。

需要注意的是,在使用 p[i] 的方式遍历数组时,指针变量 p 必须指向数组的第一个元素。在函数参数中传递数组时,数组会退化为指向第一个元素的指针,因此也可以使用 p[i] 的方式来访问数组中的元素。


总结

本篇文章我们只是简单的了解了指针的基本概念和基本用法,后续我们还会讲解指针的高级用法,大家可以多多关注我将持续更新文章。


相关文章
|
2月前
|
C语言
【c语言】指针就该这么学(1)
本文详细介绍了C语言中的指针概念及其基本操作。首先通过生活中的例子解释了指针的概念,即内存地址。接着,文章逐步讲解了指针变量的定义、取地址操作符`&`、解引用操作符`*`、指针变量的大小以及不同类型的指针变量的意义。此外,还介绍了`const`修饰符在指针中的应用,指针的运算(包括指针加减整数、指针相减和指针的大小比较),以及野指针的概念和如何规避野指针。最后,通过具体的代码示例帮助读者更好地理解和掌握指针的使用方法。
52 0
|
10天前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
58 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
10天前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
35 9
|
10天前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
32 7
|
20天前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
81 12
|
13天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
14天前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
45 3
|
14天前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
20天前
|
存储 C语言 开发者
C 语言指针与内存管理
C语言中的指针与内存管理是编程的核心概念。指针用于存储变量的内存地址,实现数据的间接访问和操作;内存管理涉及动态分配(如malloc、free函数)和释放内存,确保程序高效运行并避免内存泄漏。掌握这两者对于编写高质量的C语言程序至关重要。
42 10
|
14天前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
29 1