1.指针变量
通过指针,可以简化一些C编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。所以,想要成为一名优秀的C程序员,学习指针是很有必要的。
什么是指针?
指针也就是内存地址,指针变量是用来存放内存地址的变量。就像其他变量或常量一样,必须在使用指针存储其他变量地址之前,对其进行声明。
int a = 10;
int* p = &a;
2.三要素
-
名字:
变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下划线开头。大写字母和小写字母是不同的,因为C是大小写敏感的。
-
空间
int整型,4 个字节,取值范围-2147483648到2147483647。
-
地址
每一个变量都有一个内存位置,每一个内存位置都定义了可使用&运算符访问的地址,它表示了在内存中的一个地址。
指针变量中存放的是谁的地址, *指针变量就是谁
3.指针数组和数组指针
-
数组指针:指向数组的指针
int (*p)[n]
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n。数组指针实际上是一个指针变量,指向数组的指针变星(数组的指针), int(*p)[4]变量的类型可以看成int[4], int[4]+1就是加了(数组大小)*sizeof(类型),但是p的大小在32位中还是4字节(指针的大小)
指针的空间大小是固定的,只取决于当前的编译环境
-
指针数组:存放指针的数组
int *p[n]
[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素地址。
4.指针常量和常量指针的区别
- 指针常量是指定义了一个指针,这个指针的值只能在定义时初始化,其他地方不能改变。
- 常量指针是指定义了一个指针,这个指针指向一个只读的对象,不能通过常量指针来改变这个对象的值。
指针常量强调的是指针的不可改变性,而常量指针强调的是指针对其所指对象的不可改变性。
注:无论是指针常量还是常量指针,其最大的用途就是作为函数的形式参数,保证实参在被调用函数中的不可改变特性。
5.习题:
#include<stdio.h>
int main ( ) {
int a = 10;
int b = 20;
int* pa = &a;
int* pb = pa;
*pb = b;
b = 6;
printf ( "%d", a) ;
printf ( "%d", b);
printf ( "%d", *pa);
printf ( "%d", *pb) ;
pb = &b;
a = 8;
printf ( "%d", a);
printf ( "%d",b);
printf ( "%d",*pa);
printf ( "%d",*pb);
*pb = a ;
*pa = *pb;
pa = pb;
printf ( "%d", a);
printf ( "%d",b);
printf ( "%d", *pa);
printf ( "%d", *pb);
return 0;
6.多级指针
多级指针是指指针的指针,它可以用于多层次的间接引用和修改变量的值。通过多级指针,可以在不直接操作变量的情况下,通过连续的间接引用来访问和修改变量的值。
当声明多级指针时,每增加一个间接级别,就需要在变量名前添加一个星号(*)。例如,一个单级指针可以这样声明:
int *ptr;
而一个指向指针的指针(双级指针)可以这样声明:
int **ptr2;
以此类推,可以继续添加星号来声明更高级别的多级指针。
访问和修改值:
通过多级指针,可以通过连续的间接引用来访问和修改变量的值。对于一个n级指针,需要使用n次解引用操作(*)来访问最终的目标值。例如,对于一个双级指针ptr2
指向一个指针ptr
,再指向一个整型变量num
的情况,可以使用两次解引用操作来访问和修改num
的值,如下所示:
**ptr2 = 20; // 修改 num 的值
多级指针在许多情况下非常有用。以下是一些常见的应用场景:
- 动态内存分配:多级指针可用于管理动态分配的内存块,特别是在涉及多维数组或链表的数据结构时。
- 传递指针参数:通过传递多级指针作为函数参数,可以在函数内部修改指针所指向的数据,实现对数据的间接修改。
- 多级数据结构:多级指针可以用于处理多级嵌套的数据结构,例如树或图等。
- 函数返回多个值:通过将多级指针作为函数的返回值,可以实现函数返回多个值的需求。
多级指针提供了更灵活和高级的间接引用方式,但也增加了代码的复杂性和理解难度。因此,在使用多级指针时,需要仔细考虑其适用性和代码的可读性,下面是一个使用多级指针的简单示例:
#include <stdio.h>
int main() {
int num = 10;
int *ptr;
int **ptr2;
// 将 num 的地址赋值给 ptr
ptr = #
// 将 ptr 的地址赋值给 ptr2
ptr2 = &ptr;
// 通过 ptr2 访问和修改 num 的值
printf("num 的值为:%d\n", **ptr2); // 输出:num 的值为:10
**ptr2 = 20; // 修改 num 的值
printf("num 的值为:%d\n", **ptr2); // 输出:num 的值为:20
return 0;
}
在这个示例中,我们首先声明了一个整型变量 num
,然后声明了一个指向整型变量的指针 ptr
,再声明了一个指向指针的指针 ptr2
。我们将 num
的地址赋值给 ptr
,然后将 ptr
的地址赋值给 ptr2
。通过 **ptr2
,我们可以间接地访问和修改 num
的值。
多级指针在某些情况下非常有用,特别是在涉及函数参数传递、动态内存分配和数据结构等方面。它可以提供更灵活的操作和更高层次的间接引用。