C语言之数组指针和指针数组

C语言之数组指针和指针数组

  • 一、含义
    • 二、定义
      • [2.1 指针数组](#2.1 指针数组)
      • [2.2 数组指针](#2.2 数组指针)
    • 三、使用
      • [3.1 指针数组在参数传递时的使用](#3.1 指针数组在参数传递时的使用)
      • [3.1.1 指针数组的排序](#3.1.1 指针数组的排序)
      • [3.2 数组指针在参数传递时的使用](#3.2 数组指针在参数传递时的使用)

一、含义

  • 指针数组:顾名思义,其为一个数组,数组里面存放着多个指针,指针的类型可选。

  • 数组指针:数组指针实质上就是一个指针,用"数组"修饰这个指针,意思是说这个指针存放着一个数组的首地址,或者说这个指针指向一个数组的首地址。

    明白了吧,小伙子们。

二、定义

2.1 指针数组

c 复制代码
char* (char_array[3]) = {"hello", "world", "GGBod"}; //拥有3个元素的数组,每个元素是一个char类型的指针,总大小为 3*4=12 个字节
int* (int_array[4]) = {1, 2, 3, 4};
struct Student* (struct_array[2]) = {{xxx} ,{xxx}};

上述括号可去掉,这里只是方便大家理解。

2.2 数组指针

C 复制代码
char (*char_point)[3];  //这里的括号便不可去掉,用于指明这是一个指针

这里是一个指向一个拥有三个char类型元素的数组的指针,它指向数组的首地址,当执行 char_point++ 时,char_point会加3。

三、使用

3.1 指针数组在参数传递时的使用

  • 指针数组常用在主函数传参,在写主函数时,参数有两个,一个确定参数个数,另一个指针数组用来接收每个参数(字符串)的地址。
c 复制代码
int main(int argc, char *argv[])

此时可以想象内存映像图,主函数的栈区有一个叫argv的数组,这个数组的元素是你输入的参数的地址,指向着只读数据区。

  • 如果是向子函数传参,这和传递一个普通数组的思想一样,不能传递整个数组过去,如果数组很大,这样内存利用率很低,所以应该传递数组的首地址,用一个指针接收这个地址。因此,指针数组对应着二级指针。
c 复制代码
void fun(char **pp); //子函数中的形参
fun(char *p[]);      //主函数中的实参

3.1.1 指针数组的排序

c 复制代码
#include "stdio.h"
#include "string.h"
void sort(char **pa, int n) // 冒泡排序
{
    int i, j;
    char *tmp = NULL;

    for (i = 0; i < n - 1; i++)
    {
        for (j = 0; j < n - 1 - i; j++)
        {
            if ((strcmp(*(pa + j), *(pa + j + 1))) > 0)
            {
                tmp = *(pa + j);
                *(pa + j) = *(pa + j + 1);
                *(pa + j + 1) = tmp;
            }
        }
    }
}

int main(void)
{
    char *pa[4] = {"abc", "xyz", "opq", "jiok"};
    sort(pa, 4);
    for (int i = 0; i < 4; i++){
        printf("%s\n", pa[i]);
    }
    
    return 0;
}

3.2 数组指针在参数传递时的使用

c 复制代码
void fun(int (*P)[4]);//子函数中的形参,指针数组 

a[3][4] = {0};//主函数中定义的二维数组
fun(a);//主函数调用子函数的实参,是二维数组的首元素首地址
相关推荐
Shimeri7 分钟前
越卷越像:我用遗传算法做了个"内卷"实验
算法·three.js·数据可视化·遗传算法·进化算法
解决小子11 分钟前
【虚幻引擎】【C++】【GAS框架】构建角色基类、属性集、数值钳制
c++·笔记·游戏引擎·虚幻·gas·能力系统
Evand J30 分钟前
【PMSM例程1】永磁同步电机(PMSM)转速与转子电角度观测算法|基于扩展卡尔曼滤波(EKF)的传感器状态估计与误差。附下载链接
算法·电机·1024程序员节·卡尔曼滤波
guo_wen_qiang30 分钟前
二叉树的层序遍历-使用双端队列Deque
算法·leetcode·1024程序员节
知识分享小能手40 分钟前
C学习教程,从入门到精通,C语言学生信息管理系统 — 知识点详解(18)
c语言·学习·1024程序员节
爱读书的小胖1 小时前
LeetCode 55 跳跃游戏 C 语言解题分析
c语言·数据结构·算法·leetcode·1024程序员节
CCblandy1 小时前
前缀缓存命中率不靠引擎靠排列:本机仿真 3 轮,易变字段放开头 98.0%→0.0%
人工智能·python·算法·自然语言处理·性能优化
上班摸鱼下班游戏1 小时前
Unity 仿生智能算法 从蚁群算法 开始
算法·unity·游戏引擎
pipixia200331 小时前
C++ 面试高频:namespace 的 6 个知识点,从 using 到匿名命名空间
c语言·学习·算法·嵌入式·命名空间·c++面试·匿名命名空间
lunar_coder1 小时前
【C++】如何解决智能指针的析构函数,如何实现shared_ptr的引用计数以及解决shared_ptr的循环引用
c++·1024程序员节