C语言是一种底层编程语言,它可以直接访问内存地址,这种能力使得程序员可以对计算机的硬件进行更精细的控制,但这也意味着程序员需要承担更大的责任,因为错误的内存访问可能会导致程序崩溃或者系统不稳定,在C语言中,我们可以通过指针来实现直接访问内存地址。
(图片来源网络,侵删)
1、指针的基本概念
指针是一个变量,它的值是一个内存地址,这个地址存储了另一个变量的值,通过指针,我们可以间接地访问和操作这个变量,指针的类型决定了它指向的变量的类型,一个整型指针指向的是一个整型变量的地址。
2、声明指针
要声明一个指针,我们需要指定指针的类型和指针变量的名称,要声明一个整型指针,我们可以使用以下语法:
int *p;
这里,int
表示指针的类型,*
表示这是一个指针变量,p
是指针变量的名称,注意,这里的星号不是乘法运算符,而是类型说明符。
3、初始化指针
我们可以在声明指针时对其进行初始化,为其分配一个具体的内存地址,我们可以将一个整型变量的地址赋给一个整型指针,如下所示:
int a = 10; int *p = &a;
这里,&a
表示取整型变量a
的地址,然后将这个地址赋给整型指针p
,现在,指针p
指向了变量a
的地址,我们可以通过指针p
间接地访问和操作变量a
。
4、访问指针指向的值
要通过指针访问其指向的变量的值,我们可以使用一元运算符*
,要访问指针p
指向的变量的值,我们可以使用以下语法:
int value = *p;
这里,*p
表示取指针p
指向的变量的值,然后将这个值赋给整型变量value
,现在,变量value
存储了指针p
指向的变量的值。
5、修改指针指向的值
我们也可以通过指针修改其指向的变量的值,要将指针p
指向的变量的值加1,我们可以使用以下语法:
*p = *p + 1;
这里,*p
表示取指针p
指向的变量的值,然后将这个值加1,最后将结果赋回给指针p
指向的变量,现在,指针p
指向的变量的值已经增加了1。
6、指针与数组
C语言中的数组实际上是一种特殊的指针,当我们声明一个数组时,编译器会自动为数组生成一个指向数组首元素的指针,以下声明了一个整型数组和一个对应的整型指针:
int a[10]; // 整型数组 int *p = a; // 整型指针指向数组首元素
这里,数组a
包含10个整型元素,数组名a
实际上是一个指向数组首元素的整型指针,我们可以通过数组名和下标来访问数组元素:
int value = a[2]; // 访问数组第三个元素(下标从0开始)
我们也可以使用指针来访问和修改数组元素:
*(p + 2) = 20; // 修改数组第三个元素的值为20(先计算指针的偏移量)
7、动态内存分配与释放
C语言允许我们使用函数malloc()
和free()
来动态分配和释放内存,这两个函数分别位于头文件stdlib.h
中,以下代码动态分配了一个整数大小的内存块,并将其地址赋给了整型指针:
#include <stdlib.h> #include <stdio.h> int main() { int *p = (int *)malloc(sizeof(int)); // 动态分配一个整数大小的内存块并获取其地址 if (p == NULL) { // 如果分配失败(如内存不足),则输出错误信息并退出程序 printf("Memory allocation failed! "); return 1; } *p = 10; // 通过指针修改内存块中的值(此时值为10) printf("Value at memory address %p: %d ", p, *p); // 输出内存地址和对应的值(此时值为10) free(p); // 释放内存块(不再需要时) return 0; }
这里,我们首先包含了头文件stdlib.h
和stdio.h
,我们使用函数malloc()
动态分配了一个整数大小的内存块,并将其地址赋给了整型指针p
,如果分配失败(如内存不足),则输出错误信息并退出程序,接下来,我们通过指针修改内存块中的值(此时值为10),并输出内存地址和对应的值(此时值为10),我们使用函数free()
释放内存块(不再需要时),注意,释放后的内存块可以被其他程序或函数重新分配和使用。
评论(0)