• 指针数组和数组指针的区别及基本用法


    本博客的特点是没有长篇大论(主要是写不出来),只记录一些小点,虽然零碎,但是有用。
    今天这个话题想必是每个初学 C语言的同学都无法绕过的。下面简单介绍一下指针数组数组指针的区别,再进行画图说明,最后给出示例代码。
    指针数组:顾名思义,这是一个数组,它的每个元素都是一个指针。(这些指针指向相同类型的内存区域,这是数组的基本约束)
    数组指针:顾名思义,这是一个指针,这个指针指向一个数组。(这个数组的每个元素类型都相同,这也是数组的基本约束)

    下面用 type来表示具体使用的某个类型,它既可以很简单,也可以很复杂,在使用时,一定要能精准识别出来
    定义一个指针数组

    type *pointers[5] = {NULL, NULL, NULL, NULL, NULL};
    
    • 1

    定义一个数组指针

    type (*pointer)[5] = NULL;
    
    • 1

    形式上非常相似,但含义明显不同。
    对于 type *pointers[5];实际上声明了一个含有 5个指针元素的数组,如下所示:
    在这里插入图片描述
    对于 type (*pointer)[5];实际上声明了一个指针变量,如下所示:
    在这里插入图片描述
    使用 sizeof()可以看的更明显一些,假设 type是最简单的 char类型,我们分别输出 pointerspointer的大小:

    #include 
    
    int main(void)
    {
    	char *pointers[5];
    	char (*pointer)[5];
    
    	printf("sizeof(pointers) = %d\n", sizeof(pointers));
    	printf("sizeof(pointer) = %d\n", sizeof(pointer));
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    运行结果如下:

    $ ./a.out 
    sizeof(pointers) = 40
    sizeof(pointer) = 8
    
    • 1
    • 2
    • 3

    在我的机器上,指针大小是 8字节。

    下面还是用 char类型来讲解一下它们的基本用法,当然,更复杂的类型也是支持的。这里的重点不在于类型有多复杂,而在于我们面对的具体问题。有时候,这两种用法都能解决同一个问题,但在内存访问的灵活性便利性上有所不同,这时需要我们自己判断哪种用法更合适。

    对于指针数组,我们可以这样用:

    #define MAX_SIZE 5
    void use_pointer_array(void)
    {
    	int i = 0;
    
    	char *A[MAX_SIZE] = {
    		"Monday",
    		"Tuesday",
    		"Wednesday",
    		"Thursay",
    		"Friday"
    	};
    
    	for (i = 0; i < MAX_SIZE - 1; ++i)
    		printf("A[%d] = %s, ", i, A[i]);
    	printf("A[%d] = %s\n", i, A[i]);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    输出结果是:

    A[0] = Monday, A[1] = Tuesday, A[2] = Wednesday, A[3] = Thursay, A[4] = Friday
    
    • 1

    对于数组指针,我们可以这样用:

    void use_array_pointer_1(void)
    {
    	char (*B)[MAX_SIZE];
    
    	char C[MAX_SIZE] = "1234";
    
    	B = &C;
    	printf("(*B) = %s\n", (*B));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    输出结果是:

    (*B) = 1234
    
    • 1

    面对更复杂的问题,对于数组指针,我们还可以这样用:

    void use_array_pointer_2(void)
    {
    	char (*B)[MAX_SIZE];
    
    	char C[3 * MAX_SIZE] = "1234\0ABCD\0abcd\0";
    
    	B = (char (*)[MAX_SIZE])&C;
    	printf("B[0] = %s, B[1] = %s, B[2] = %s\n", B[0], B[1], B[2]);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    输出结果是:

    B[0] = 1234, B[1] = ABCD, B[2] = abcd
    
    • 1
  • 相关阅读:
    Vue3系列文章 —(1)介绍
    运动耳机买什么样的好、值得推荐的运动耳机
    031-从零搭建微服务-监控中心(一)
    Kotlin数据流概览
    window下编译openssl
    关于我在配置zookeeper出现,启动成功,进程存在,但是查看状态却没有出现Mode:xxxxx的问题和我的解决方案
    SpringBoot+Vue项目社区团购系统
    东软睿驰受邀出席恩智浦汽车生态技术峰会,见证S32 CoreRide开放平台全新发布
    【torch-Random sampling】随机采样
    驾驶员蓝牙耳机怎么选?开车可以打电话的蓝牙耳机
  • 原文地址:https://blog.csdn.net/choumin/article/details/126435722