自学内容网 自学内容网

C语言——指针数组、指针函数

C语言中的指针数组

一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都存放一个地址,相当于一个指针变量。

定义指针数组

指针数组的定义方式与普通数组类似,只不过数组的元素类型是指针类型。以下是一个定义指向整型数据的指针数组的示例:

int *p[4]; // 定义一个包含4个元素的指针数组,每个元素都是指向int的指针


由 [ ] 比 * 优先级高,因此 p 先与 [4] 结合,形成p[4]形式,这显然是数组形式,表示p数组有4个元素。然后再与p前面的 “ * " 结合,“ * ” 表示此数组是指针类型的,每个数组元素(相当于一个指针变量)都可指向一个整型变量。

注意不要写成

int(* p)[4];                              //这是指向一维数组的指针变量

定义一维指针数组的一般形式为

类型名*数组名[数组长度];

类型名中应包括符号“ * ”,如 “ int * ” 表示是指向整型数据的指针类型

初始化指针数组

指针数组可以在定义时初始化,但需要注意的是,你不能直接初始化指针数组中的每个指针指向具体的整数值,因为指针只能存储地址。不过,你可以让指针指向已定义的整型变量,或者使用动态内存分配(如 malloc)来分配内存给指针。

int a = 1, b = 2, c = 3;  
int *arr[3] = {&a, &b, &c}; // 初始化指针数组,每个元素分别指向a, b, c  
  
// 或者使用动态内存分配  
int *arr2[3];  
for(int i = 0; i < 3; i++) {  
    arr2[i] = (int*)malloc(sizeof(int)); // 为每个指针分配内存  
    if(arr2[i] != NULL) {  
        *arr2[i] = i + 10; // 通过解引用给分配的内存赋值  
    }  
}

使用指针数组

使用指针数组时,你可以通过指针来访问或修改它所指向的变量的值。

for(int i = 0; i < 3; i++) {  
    printf("%d ", *arr[i]); // 访问arr中每个指针所指向的整数值  
}  
  
// 释放动态分配的内存  
for(int i = 0; i < 3; i++) {  
    free(arr2[i]);  
}

注意事项

  • 当使用动态内存分配(如 malloc)为指针数组中的指针分配内存时,记得在不再需要时释放这些内存,以避免内存泄漏。
  • 指针数组与普通数组一样,其索引是从0开始的。
  • 指针数组提供了一种高效的方式来管理一组动态分配的对象或一组数据项的引用。

C语言中的指针函数

(Pointer to Function)是一种特殊的函数类型,它执行某些操作后返回一个指针,这个指针可以指向任何有效的数据类型,包括基本数据类型(如int、float等)、数组、结构体、甚至是另一个函数(但通常不这样做,因为函数名本身就代表了函数的地址)。

定义指针函数

定义返回指针的函数时,需要在函数名前的返回类型部分指定为指针类型。指针类型由基础数据类型和星号(*)组成,星号表示这是一个指针。

指向函数的指针的声明方式如下:

返回类型* 函数名(参数列表) {
    // 函数体
}

int* getPose(int stu,int (*pstu)[4])   //返回一个整型指针
{
int *p;

p = (int *)(pstu + stu);                  
return p;
}

使用返回指针的函数

使用返回指针的函数时,需要接收函数的返回值(即指针),你可以将这个指针赋值给一个变量,或者直接使用这个指针来访问或操作它所指向的数据。

int *pstu;

pstu = getPose(stu,score);  
for(int i=0;i<4;i++){
printf("%d ",*pstu++);
}

注意事项

  1. 内存管理:返回指针的函数通常会分配内存来存储数据。因此,调用者有责任在不再需要这些数据时释放这些内存,以避免内存泄漏。

  2. 空指针检查:在访问指针指向的数据之前,应该检查指针是否为NULL。这可以防止在内存分配失败时解引用空指针,从而导致程序崩溃。

  3. 类型安全:虽然C语言允许将任何类型的指针赋值给void*类型的指针,但在将void*类型的指针转换回原始类型时,需要确保类型匹配,以避免类型错误和潜在的数据损坏。

  4. 函数参数:如果函数需要修改调用者提供的指针所指向的数据,那么函数参数应该是指针的指针(即**),而不是单独的指针。这是因为C语言是按值传递参数的,单独的指针参数传递的是指针的副本,而不是指针本身。

  5. 函数指针与返回指针的函数:虽然函数指针和返回指针的函数在C语言中都是重要的概念,但它们是不同的。函数指针是指向函数的指针,而返回指针的函数是返回指针的函数。不要混淆这两者。

示例:

#include<stdio.h>
#include<stdlib.h>

int* getPose(int stu,int (*pstu)[4]) //因为需要将存储学生分数的数组score传过来,因此我们定义了一个数组指针pstu
{
int *p;

p = (int *)(pstu + stu);  //pstu代表的是二维数组score的数组名首地址,因此他是按行偏移的,偏移地址为stu*N
                 //而定义的p为整型指针4个字节,因此会有警告。使用(int *)强制转换可解决,因为我们在这里关心的是首地址,警告不影响我们程序结果
return p;
}

int main()
{
int score[3][4] = {{98,99,97,100},      //每行代表一个学生的四项成绩
               {56,58,59,59},
   {85,89,87,88}};
int *pstu;
int stu;

printf("请输入你要查询的学生序号:0、1、2\n");
scanf("%d",&stu);
if(stu>2){
printf("输入错误!\n");
exit(-1);
}
pstu = getPose(stu,score);  
for(int i=0;i<4;i++){
printf("%d ",*pstu++);
}
return 0;
}

输出将是:

请输入你要查询的学生序号:0、1、2
0
98 99 97 100


原文地址:https://blog.csdn.net/weixin_45720999/article/details/140516086

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!