【总结归纳】指针数组和数组指针

本文详细解析了C语言中的指针数组和数组指针的概念及其应用,通过实例对比了两者之间的区别,并介绍了如何正确地声明和使用它们。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

指针数组和数组指针

在刚接触C语言的时候,指针数组和数组指针往往分不清楚。下面就研究一下怎么区分它们和怎么理解它们。

指针数组

指针数组中的每个存储区是一个指针类型的存储区。用我自己的话描述就是存放指针变量的数组。现在先看看指针数组是怎么声明的。

 

例 一:

 

int num[3];          //存放整型变量(int)的数组,num是数组名字,[3]是数组里存放元素的个数,int代表了元素的数据类型

 

int* num[3];        //存放整型指针变量(int*)的数组num是数组名字,[3]是数组里存放 元素的个数,int*代表了元素的数据类型

 

char str[3];           //存放字符变量(char)的数组,可以当字符串使用

 

char* str[3];         //存放字符指针变量(*char)的数组,也可以理解位存放字符串的数组

 

以上例子中,关于字符串的内容我会另外把笔记整理出来。

 

例 二:

 

int main()
{
       int a, b, c;
       int* p_a = &a;
       int* p_b = &b;    
       int* p_c = &c;
       //这里声明一个指针数组,来存放上面的3个指针变量
       int* arr[3] = {p_a, p_b, p_c};
 
       int i = 0;
       for(i = 0; i < 3; i++)
       {
              //把数组里的指针变量依次拿出来,加上*表示对指针变量里面的数据当存储区使用,也就是分别对变量a, b, c进行赋值。
              *(arr[i]) = i;
       }
       printf("a== %d, b == %d, c ==%d\n", a, b, c);
       return 0;
}

 

输出的结果是 a == 0,b == 1, c ==2;证明了指针数组就是用来存储指针变量的数组。

数组指针

当声明一个数组的后,数组名称就代表了这一个连续的存储区,同时编译器会把这一个连续的存储区的首地址编号返回给数组名称,那么一个一级指针也能当做一维数组使用,如下:

例 三:

#include <stdio.h>
 
int main()
{
       intarr[] = {1, 2, 3, 4, 5};
       int*p_arr = &arr[0];                       //和int*p_arr = arr;效果一样
       inti = 0;
 
       for(i = 0; i < 5; i++)
       {
              printf("%d ", p_arr[i]);             //p_arr[i]等价于*(p_arr + i)
       }
       printf("\n");
 
       return0;
}

 

编译通过,执行结果为:1 2 3 4。证明了只要指针变量取得数据类型相匹配的一维数组的首地址,那么这个指针就能当作一维数组使用。原因是通过对地址的运算,就能找出对应的存储区。

但是,如果二维数组的话,就不行了,因为通过指针变量里存储的地址编号,通过运算是没法找到与二维数组相对应的存储区,如果要用一个指针变量代表一个二维数组,就需要用到数组指针了。数组指针的声明如下:

 

例 四:

 

char (*p_str)[3];         //这是一个字符数组指针,(*p_str)是一个指针变量,它指向一个 长度为3(存放3个元素)的一维字符数组。

 

int(*p_arr)[3];             //这是一个整型数组指针,(*p_arr)是一个指针变量,它指向一个长度为3(存放3个元素)的一维整型数组。

 

int(*p_arr)[3][3];        //这是一个整型数组指针,(*p_arr)是一个指针变量,它指向一个长度为3(存放3个元素)的二维整型数组,

每个元素是一个长度为3的一维的整型数组。

例 五:

 

#include <stdio.h>
 
int main()
{
       int arr[3][3];
       int i = 0;
       int j = 0;
       int count = 0;
 
       for(i = 0; i < 3; i++)
       {
              for (j = 0; j < 3; j++)
              {
                     arr[i][j]= count++;
              }
       }
 
       int **pp_arr = arr;
       //执行下面被注释的8行代码的时候出现段错误,表明了2级指针并不能能当作二维数组使用
       /*for(i = 0; i < 3; i++)
       {
              for (j = 0; j < 3; j++)
              {
                     printf("%d", pp_arr[i][j]);
              }
              printf("\n");
       }*/
       //用一个数组指针指向数组arr,就能把这个指针当作二维数组使用了
       //但注意的是必须提供一维数组中元素的个数
       int(*p_arr)[][3] = &arr;
       for(i = 0; i < 3; i++)
       {
              for (j = 0; j < 3; j++)
              {
                     printf("%d", (*p_arr)[i][j]);
              }
              printf("\n");
       }
 
       return0;
}
 


在例五中可以看出一个数组指针能够当作一个二维数组使用,但声明这个数组指针的时候必须提供二维数组中一维数组中的元素个数,个人感觉使用到数组指针的地方还是比较少的,实用性不高,所以也就初步了了解下而已,知道这么一种指针就好了,暂时不再深究下去。

这次的内容很多都是我自己对学到的知识进行整理,再加上自己的理解而发表的文章,老师的笔记只占了一小部分,如果有错误的地方欢迎纠正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值