Skip to content

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 在线工具 | 菜鸟工具 - jyshare.com

leetcode数据结构例题

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;

这行代码声明了一个指向整数的指针pint *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向后移动一个元素,指向数组的下一个元素。

希望这些解释和示例代码能帮助你更好地理解指针的语法和使用。

贡献者

The avatar of contributor named as sunchengzhi sunchengzhi

文件历史

撰写