指针数组概念

一个数组,其元素均为指针类型数据,称为指针数组。

                           即:指针数组中每一个元素都是指针变量。

指针数组的定义格式:

                    类型标识符 *数组名(数字长度说明);

如:

                    int *p[4];   //每个数组元素都可以看成是一个指针变量,都可以指向 一个整型普通变量。

                数组指针:int (*p)[4];     //这是指向一维数组的指针变量,也就是说,他首先是一个指针变量。

例题:

#include<stdio.h>


int main()
{
    char *pName[]={"C++","JAVA","PYTHON","GO","CSHarp"};  //指针数组
    int is1=sizeof(pName);   //每个指针变量占4个字节,所以有五个元素一共占20个字节
    int isize=is1/sizeof(pName[0]);   //20/4=5,表示pName中有5个元素,pName能引用的下标就是[0]-[4]
    int i;


    char *p2="JAVA";   //把字符串的首地址赋值给指针;字符串常量会固定分配地址;p2=pName[1]


    for(i=0;i<isize;i++)
    {
        printf("pName[%d]=%s\n",i,pName[i]);
    }
    printf("----------------------------------\n");


    char *ptemp;
    ptemp=pName[0];   //ptemp指向了"C++"
    pName[0]=pName[1];  //pName[0]指向了"JAVA"
    pName[1]=ptemp;     //pName[1]指向了"C++"
    /*
    ptemp保存了"C++"的地址,然后pName[1]保存了"JAVA"的地址,最后再把"C++"的地址给pName[2].
    */
    for(i=0;i<isize;i++)
    {
        printf("pName[%d]=%s\n",i,pName[i]);
    }
    printf("----------------------------------\n");
    return 0;
}

二、指向指针的指针
用来指向指针变量 的变量,简称:指向指针的指针。
char **p;    //定义了一个 指向  字符串指针变量的  指针变量
int **p;       //定义了一个 指向  整型指针变量的  指针变量
*(*p);   //表示  指针变量p  是  指向一个  指针变量,*p 是 p  所指向的 指针变量。

 

接上方代码

char **pp;   //定义一个指向指针的指针
    pp=&pName[0];   //*pp就是pp所指向的指针,也就是pName[0];
    printf("pp=%s\n",*pp);
    printf("----------------------------------\n");


    int abc=5;
    int *pabc=&abc;   //指向 整型数据的指针  *pabc保存的是 abc的地址
    int **ppabc=&pabc;   //指向 指针的指针   **ppabc保存的是 [*pabc保存的地址(就是abc的地址)]
    printf("abc=%d\n",abc);
    printf("abc=%d\n",*pabc);
    printf("abc=%d\n",**ppabc);  //*ppabc 等价于 pabc,所以 **ppabc 等价于 abc


    return 0;
}
三、指针数组做main函数形参
指针数组有个重要应用:
第一种传递形参的方法:
第一种方法:



第一种方法:

int main(int arge,char *argv[])  //int arge:整型形参  应该是argv指针数组的元素个数
                                 //char *argv[]:指针数组做函数形参argv[0]保存的是 当前可执行文件的完整路径文件 名;可以接收不确定参数个数
{
    int i;
    printf("argc=%d\n",arge);   //我们输入的参数个数 +1
    for(i=0;i<arge;i++)
    {
        printf("argv[%d]=%s\n",i,argv[i]);


        //等价于上面一条代码
        printf("argv[%d]=%s\n",i,*argv);
        argv++;
    }


    printf("-------\n");
    return 0;
}

第二种传递形参的方法(使用命令行):

四、本章小结
1、指针数据类型小结表
2、指针运算小结
① 指针变量的 加减
p++;p--
int *p;  1000;1004
②指针变量的 赋值
int *p =1000; //这样是 不可以的,不能直接赋予数字,不要认为可以将地址赋值给p,只能够将变量的已经分配的地址赋值给指针变量。
int a;
int *p=&a;  //只可以这样
③指针变量 可以为空值表示不指向任何变量
int *p=NULL;  //NULL就是整数0,就是使p指向地址为0的单元;
                         //系统会保证地址为0这个单元不存放有效数据
if(p==NULL)
{
     //p=&a;
}
3、void  *型指针:万能型指针变量,也就是 能够指向任意数据类型
int a=3;
int *p=&a;
float bf=56.f;
float *pg=&bf;
void *pwn=NULL;
pwn=p;   //可以把整型变量的地址赋值给万能型指针变量
pwn=pf;   //这个也可以把上面bf的地址赋值给他
pf=(float *)pwn;  //这里把pwn的地址赋值回给pf必须强制类型转换
4、总结
指针的优点: 效率高
指针的缺点: 太过灵活

 

 

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
指针数组和数组指针是两种不同的概念指针数组是一个数组,其中的每个元素都是指针。例如,int *(p1\[5\])定义了一个指针数组,它包含了5个指针元素。这个数组本身占用的内存空间取决于数组的大小,而每个指针元素所指向的对象占用的内存空间则由指针类型决定。\[1\] 数组指针是一个指针,它指向一个数组。例如,int (*p2)\[5\]定义了一个指向包含5个整数的数组的指针。这个指针本身占用的内存空间是固定的,通常是4个字节(在32位系统下)。而指针所指向的数组占用的内存空间取决于数组的大小和元素类型。\[2\] 因此,指针数组和数组指针在定义和内存占用上有所不同。指针数组是一个数组,每个元素都是指针;而数组指针是一个指针,它指向一个数组。\[3\] #### 引用[.reference_title] - *1* *3* [C语言指针与二维数组](https://blog.csdn.net/qq_38325803/article/details/100547699)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [数组指针和指针数组](https://blog.csdn.net/mick_hu/article/details/100931034)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值