C指针进阶

数组指针和指针数组:

表达的优先级问题:

(*p)[n]:根据优先级,先看括号内,则p是一个指针,这个指针指向一个一维数组,数组长度为n,这是“数组的指针”,即数组指针;

*p[n]:根据优先级,先看[ ],则p是一个数组,再结合*,这个数组的元素是指针类型,共n个元素,这是“指针的数组”,即指针数组。

来看一个关于指针数组的代码:

const定义的变量在程序里禁止被改变。

#include "stdio.h"
int main (void )
{
    int i,flag;
    char ch;
    const char *p[5]={"red","blue","yellow","green","black"};
    printf("input a letter:");
    ch=getchar();
    printf("%c\n",*p[0]);
    for(i=0;i<5;i++)
    {
        if(*p[i]==ch)
        {
            puts(p[i]);
            flag = 1;
        }

    }
    if(flag==0)
    {
        printf("Not Fount");
    }
    return 0;
}

其中p为指针数组,其中每个元素为数组,分别指向每个字符串的首字母。

printf("%c",*p[0]);

会输出r,也就是第一个字符串的首字母。

关于&p与p

&p指的是整个数组的地址,p指的是数组首元素的地址;两者虽然数值一样,但其的类型的是不同的,&p为数组指针,而p为指向单个字符的指针。

指针的指针:

定义:

类型名 **变量名;

也被称为二级指针,为指向指针的指针;

int a =10;
int *p=&a;
int **p=&p;

二维数组的指针形式:

对于a[3][5];

可以把二维数组a看成是由a[0],a[1],a[2];组成的一维数组;而a[0],a[1],a[2];各自又是一个一维数组。也就是说二维数组是数组元素为一维数组的一维数组。

即a[3][5]={a[0],a[1],a[2]};

所以a为a[0]整个数组的地址,所以a为一个二级指针。则,a+i为第i行的地址,*(a+i)为第i行首元素是地址,(即a[i]),又**a则为第i行首元素的值

在要处理多个字符串的情况下,我们通常用二维数组和指针数组:

#include "stdio.h"
#include "string.h"
int main(void )
{
    int i;
    char *p[5]={"red","blue","yellow","green","black"};
    void fsort(char *p[],int n);
    fsort(p,5);
    for(i=0;i<5;i++)
    {
        printf("%7s",p[i]);
    }
    return 0;
}
void fsort(char *p[],int n)
{
    char *temp;
    int j,k;
    for(j=0;j<n;j++)
    {
        for(k=j+1;k<n;k++)
        {
            if(strcmp(p[j],p[k])>0)
            {
                temp=p[j];
                p[j]=p[k];
                p[k]=temp;
            }

        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值