指针与数组的关系【指针型指针,指针型数组,数组型指针,数组型数组的区别】

6 篇文章 0 订阅

结论:

(1)一个指针型指针指向一个指针型地址  (int **pp)

(2)一个数组型指针指向一个数组型地址  (int (*ap)[5])

(3)指针型数组变量就是一个指针型地址  (int  *pa [5])

(4)数组型数组变量就是一个数组型地址  (int aa[3][2])


因为我们知道XX型数组就是代表一个XX型的地址,而指针就是代表某种数据类型的地址,所以上面的四种形式其实有的是可以相互等同的。即,指针型指针 == 指针型数组;数组型指针 == 数组型数组(也就是二维数组)。


1、指针型指针和指针数组

char *a[] = {"i","am","a","boy", NULL};
char **p = NULL;
for(p = a; *p ! = NULL; P++)  //p = a, 将a赋值给p。此时他们都指向同一个字符串常量位置。
{
       printf("%s\n", *p);
}

用指针型数组对多个字符串进行排序的一个优点是,不需要进行字符串移动,只需要改变指针的指向。

对比如下

/**********************字符串排序指针数组实现**********************/
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
       char *temp = NULL;
       char *ptr[] = {"JAVA", "BASIC", "PASCAL", "FORTRAN", "VISUAL C"}; //定义指针数组
       int i=0, j=0;
       int n = sizeof(ptr)/sizeof(ptr[1]);  //可以看出ptr符合数组的概念
       for(i=0; i<n-1; i++)
       {
           for(j=i+1; j<n; j++)
           {
              if(strcmp(ptr[i], ptr[j]) < 0)
             {
                   temp = ptr[i]; //直接排序指针,不移动字符串本身
                   ptr[i] = ptr[j];
                   ptr[j] = temp;
              }
            }
       }
       printf("%d\n", n);
       for(i=0; i<n; i++)
          printf("%s\n", ptr[i]);
       system("pause");
       return 0;           
}
/**********************字符串排序二维数组实现**********************/
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char temp[10] = {'\0'};
    int i=0, j=0;
    char ss[][10] = {"JAVA", "BASIC", "PASCAL", "FORTRAN", "VISUAL C"}; //用二维数组存储多个字符串
    int n = sizeof(ss)/sizeof(ss[1]);
    for(i=0; i<n-1; i++)
    {     
      for(j=i; j<n; j++)
      {
        if(strcmp(ss[j], ss[i])<0)  //直接移动字符串本身
        {
             strcpy( temp, ss[i]);  //字符串赋值必须是使用strcpy函数
             strcpy( ss[i], ss[j]);
             strcpy( ss[j], temp);             
        }
      } 
    }   
    printf("%d\n", n);
    for(i=0; i<n; i++)
        printf("%s\n", ss[i]);
    system("pause");
    return 0;
}

 
运行结果: 

2、数组指针和二维数组

定义数组指针 int (*ap)[5] -这是一个指针,指针指向的类型为int[5],这是一个一维数组型变量。【注意:[]的优先级高于“*”,所以需要用()来改变一下优先级】

即有int (*P) [3] == int a[2][3]成立

本文参考自人民邮电大学出版赵岩《C语音点滴》,第10章10.6的内容,内容进行过整理,代码也进行过完善。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值