切换主题
C 指针
字数
1962 字
阅读时间
9 分钟
学习 C 语言的指针既简单又有趣。通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。所以,想要成为一名优秀的 C 程序员,学习指针是很有必要的。
正如您所知道的,每一个变量都有一个内存位置,每一个内存位置都定义了可使用 & 运算符访问的地址,它表示了在内存中的一个地址。
请看下面的实例,它将输出定义的变量地址:
实例
c
#include <stdio.h>
int main ()
{
int var_runoob = 10;
int *p; // 定义指针变量
p = &var_runoob;
printf("var_runoob 变量的地址: %p\n", p);
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
var_runoob 变量的地址: 0x7ffeeaae08d8
![[Pasted image 20240925162526.png]]
通过上面的实例,我们了解了什么是内存地址以及如何访问它。接下来让我们看看什么是指针。
什么是指针?
指针也就是内存地址,指针变量是用来存放内存地址的变量。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:
type *var_name;
在这里,type 是指针的基类型,它必须是一个有效的 C 数据类型,var_name 是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针。以下是有效的指针声明:
c
int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */
所有实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,对应指针的值的类型都是一样的,都是一个代表内存地址的长的十六进制数。
不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。
如何使用指针?
使用指针时会频繁进行以下几个操作:定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值。下面的实例涉及到了这些操作:
c
#include <stdio.h>
int main ()
{
int var = 20; /* 实际变量的声明 */
int *ip; /* 指针变量的声明 */
ip = &var; /* 在指针变量中存储 var 的地址 */
printf("var 变量的地址: %p\n", &var );
/* 在指针变量中存储的地址 */
printf("ip 变量存储的地址: %p\n", ip );
/* 使用指针访问值 */
printf("*ip 变量的值: %d\n", *ip );
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
c
var 变量的地址: 0x7ffeeef168d8
ip 变量存储的地址: 0x7ffeeef168d8
*ip 变量的值: 20
c-clang在线运行,在线工具,在线编译IDE_w3cschool - 编程狮https://www.w3cschool.cn/tryrun/runcode?lang=c-clang
c
#include <stdlib.h>
// Definition for singly-linked list.
struct ListNode {
int val;
struct ListNode *next;
};
void deleteNode(struct ListNode* node) {
// Copy the value of the next node into the current node
node->val = node->next->val;
// Save the next node to delete it
struct ListNode* temp = node->next;
// Skip the next node by pointing to the node after it
node->next = node->next->next;
// Free the memory of the node that is no longer needed
free(temp);
}
在C语言中,指针是一种特殊的变量,它存储的是另一个变量的地址。指针的语法和使用是C语言中的一个重要概念。下面是对指针语法的详细解释:
指针的声明
c
复制代码
int *p;
这行代码声明了一个指向整数的指针p
。int *p
可以拆解为:
int
:指针所指向的变量的数据类型。*
:表示这是一个指针。p
:指针的名字。
获取变量的地址
c
复制代码
int a = 10; int *p = &a;
这里,&
操作符用于获取变量a
的地址,并将该地址存储在指针p
中。p
现在指向变量a
。
解引用指针
c
复制代码
int value = *p;
使用*
操作符可以访问指针所指向的变量的值。这里,*p
表示指针p
所指向的变量a
的值,所以value
将被赋值为10
。
修改指针所指向的值
c
复制代码
*p = 20;
这行代码将通过指针p
修改其所指向的变量a
的值,将其改为20
。
指针的初始化
指针在声明时可以初始化,也可以在声明后初始化。
c
复制代码
int a = 10; int *p = &a; // 声明时初始化 int b = 20; int *q; // 声明 q = &b; // 初始化
指针的不同类型
不同类型的指针指向不同类型的数据。
c
复制代码
int *p; // 指向int类型数据的指针 char *c; // 指向char类型数据的指针 float *f; // 指向float类型数据的指针
指针的算术运算
指针可以进行算术运算,但其结果取决于指针指向的数据类型。
c
复制代码
int arr[5] = {1, 2, 3, 4, 5}; int *p = arr; p++; // p现在指向arr[1],即数组中的第二个元素
这里,p++
将指针p
向后移动一个int
类型的大小。
指针数组
指针数组是存储指针的数组。
c
复制代码
int *arr[5]; // 这是一个包含5个指针的数组,每个指针指向一个int类型的数据
指针指针
指针指针是指向指针的指针。
c
复制代码
int a = 10; int *p = &a; int **pp = &p; // 指针指针,指向p
在这里,pp
是一个指向指针p
的指针,**pp
可以用来访问变量a
的值。
示例代码
以下是一个完整的示例代码,展示了指针的声明、初始化、解引用以及指针的算术运算:
c
复制代码
#include <stdio.h> int main() { int a = 10; int *p = &a; // 指针p指向a的地址 printf("a = %d\n", a); printf("*p = %d\n", *p); *p = 20; // 通过指针修改a的值 printf("a (after modification) = %d\n", a); int arr[3] = {1, 2, 3}; int *q = arr; // 指针q指向数组arr的第一个元素 printf("First element: %d\n", *q); q++; // 指针q指向数组arr的第二个元素 printf("Second element: %d\n", *q); return 0; }
解释
int *p = &a;
:声明并初始化指针p
,使其指向变量a
。*p
:解引用指针p
,获取其指向的变量a
的值。*p = 20;
:通过指针p
修改变量a
的值。int *q = arr;
:指针q
指向数组arr
的第一个元素。q++
:指针q
向后移动一个元素,指向数组的下一个元素。
希望这些解释和示例代码能帮助你更好地理解指针的语法和使用。
贡献者
sunchengzhi