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

原创 2015年07月07日 17:22:48

结论:

(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的内容,内容进行过整理,代码也进行过完善。

char型数组转换为Int(指针的规范使用)

最近在写一个读取文件,得到里面存储的事例,进行解压缩然后转换图片进行存盘的工作,文件中存储event的顺序如下: 可以看到数据的长度都存到了m_datasize的这四个字节里,因此如果要读到...
  • ucasliyang
  • ucasliyang
  • 2016年11月13日 21:24
  • 1473

数组、指针和字符串:指针的赋值和指针运算

当我们声明了一个指针之后,这个指针变量中没有存储任何确定的地址值,而是一个随机整数。也就是它指向的地址是不确定的,有可能它指向了系统的重要数据,这时候我们如果修改了它指向地址的值可能会引起想象不到的系...
  • u012589862
  • u012589862
  • 2014年05月21日 14:36
  • 1577

字符指针与字符数组真正的区别

本文从字符串指针与字符串数组的例子开始,讲述了C语言中使用内存的不同方式,以及他们与Linux内存布局的关系。并使用Linux下的工具对想法进行了验证。...
  • on_1y
  • on_1y
  • 2013年10月25日 20:46
  • 13157

指针数组数组传参、指针引用传参

指针和数组作为参数传入函数时,传入的是地址,即指向变量的地址和数组的首地址,可以在函数中改变指针或数组的值,但本质上它们还是值的传递(区别于变量的值传递的是:变量值传递不会改变实参原来的值。),我们无...
  • dongchongyang
  • dongchongyang
  • 2016年09月17日 23:47
  • 1489

100 数组和指针绝不等价,数组是另外一种类型

C学习网:链接->C学习网 C训练网:链接->C训练网 通过前面的讲解,相信很多读者都会认为数组和指针是等价的,数组名表示数组的首地址。不幸的是,这是一种非常危险的想法,并不完全正确,前面我们...
  • czg13548930186
  • czg13548930186
  • 2017年06月06日 00:34
  • 1713

面试题之数组指针和指针数组的区别

1、数组指针(指向数组的指针) (1)数组在内存中的表示 创建一个数组就是在内存里面开辟一块连续的空间,比如int a[4];就是在内存里面开辟了一个大小为4*sizeof(int)字节的...
  • sum_TW
  • sum_TW
  • 2016年12月09日 16:28
  • 3896

数组指针和指针数组的区别

数组指针和指针数组的区别中国的文字博大精深,不仔细研读,很容易理解错误,就拿这个数组指针和指针数组来说吧,刚开始接触很容易弄混 那么到底什么是数组指针?什么是指针数组?他们之间又有什么区别?* 指...
  • qq_30137611
  • qq_30137611
  • 2016年10月01日 00:25
  • 555

【C语言】12-指向一维数组元素的指针

本文目录 一、用指针指向一维数组的元素二、用指针遍历数组元素三、指针与数组的总结四、数组、指针与函数参数 前面我们已经学习了指针,如果指针存储了某个变量的地址,我们就可以说指针指向...
  • luohai859
  • luohai859
  • 2014年04月30日 16:40
  • 8907

数组与指针关系

1
  • App_12062011
  • App_12062011
  • 2013年09月15日 20:25
  • 3262

C语言:数组和指针的区别

实际上关于数组与指针的区别这个问题在《C专家编程》已经有很详细的阐释,但我想用自己的语言说一说我的理解。数组是指针?最近在做数据结构课设,其中一个函数发生了令人费解的错误,简化后的代码如下:#incl...
  • imred
  • imred
  • 2015年05月02日 19:08
  • 13156
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:指针与数组的关系【指针型指针,指针型数组,数组型指针,数组型数组的区别】
举报原因:
原因补充:

(最多只允许输入30个字)