zoukankan      html  css  js  c++  java
  • 指针与数组

     【1】数组名可以当作一个指针如何理解?

    数组的数组名其实可以看作一个指针。

    (1)示例代码如下:

    1 int   array[10]={0,1,2,3,4,5,6,7,8,9},value;
    2 value  =  array[0];       //也可写成:value=*array;
    3 value  =  array[3];       //也可写成:value=*(array+3);
    4 value  =  array[4];       //也可写成:value=*(array+4);

    上例中,一般而言数组名array 代表数组本身,类型是int[10]。

    但如果把array 看做指针的话,它指向数组的第0 个单元,类型是int*,所指向的类型是数组单元的类型即int。

    因此*array 等于0 就一点也不奇怪了。同理,array+3 是一个指向数组第3 个单元的指针,所以*(array+3)等于3。其它依此类推。

    (2)示例代码如下:

    1 char *str[3]={
    2 "Hello,thisisasample!",
    3 "Hi,goodmorning.",
    4 "Helloworld"
    5 };
    6 char  s[80];
    7 strcpy(s,str[0]); //也可写成strcpy(s,*str);
    8 strcpy(s,str[1]); //也可写成strcpy(s,*(str+1));
    9 strcpy(s,str[2]); //也可写成strcpy(s,*(str+2));

    上例中,str 是一个三单元的数组,该数组的每个单元都是一个指针,这些指针各指向一个字符串。

    把数组名str 当作一个指针的话,它指向数组的第0号单元,它的类型是char **,它指向的类型是char *。

    *str 也是一个指针,它的类型是char *,它所指向的类型是char。

    它指向的地址是字符串"Hello,thisisasample!"的第一个字符的地址,即'H'的地址。

    注意:字符串相当于是一个数组,在内存中以数组的形式储存,只不过字符串是一个数组常量,内容不可改变,且只能是右值。

    如果看成指针的话,它即是常量指针,也是指针常量。

    str+1 也是一个指针,它指向数组的第1号单元,它的类型是char**,它指向的类型是 char*。

    *(str+1) 也是一个指针,它的类型是char*,它所指向的类型是char,它指向"Hi,goodmorning."的第一个字符'H'。

    总结数组名:

    声明了一个数组TYPE array[n]时,数组名称array 就有了两重含义:

    第一,它代表整个数组,它的类型是TYPE[n]。

    第二,它是一个常量指针,该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组单元的类型。

    该指针指向的内存区就是数组第0号单元,该指针自己占有单独的内存区,注意它和数组第0号单元占据的内存区是不同的。

    该指针的值是不能修改的,即类似array++的表达式是错误的。

    在不同的表达式中数组名array 可以扮演不同的角色。例如:

    在表达式sizeof(array)中,数组名array 代表数组本身,故这时sizeof 函数测出的是整个数组的大小。

    在表达式*array 中,array 扮演的是指针,因此这个表达式的结果就是数组第0 号单元的值。sizeof(*array)测出的是数组单元的大小。

    表达式array+n(其中n=0,1,2,.....)中,array 扮演的是指针,故array+n 的结果是一个指针,它的类型是TYPE *,它指向的类

    型是TYPE,它指向数组第n 号单元。故sizeof(array+n)测出的是指针类型的大小。在32 位程序中结果是4。

    示例代码如下:

     1 #include<iostream>
     2 using namespace std;
     3 
     4 void  main()
     5 {
     6     int   array[10];
     7     int (*ptr)[10];
     8     ptr = &array;
     9     cout<<sizeof(int(*)[10])<<endl;      //4
    10     cout<<sizeof(int[10])<<endl;         //40
    11     cout<<sizeof(ptr)<<endl;             //4
    12     
    13 }

    上例中,上例中ptr 是一个指针,它的类型是int(*)[10],它指向的类型是int[10] ,我们用整个数组的首地址来初始化它。

    在语句ptr=&array中,array 代表数组本身。

    【2】数组指针与指针数组如何区别?

    (1)数组指针

    声明示例代码如下:

     int (*p)[n];

    ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长(也就是说执行p+1时,p要跨过n个整型数据的长度)。

    如果将二维数组赋给一个指针,应这样赋值:

    1 int a[3][4];
    2  int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
    3  p = a; //将该二维数组的首地址赋给p,也就是a[0] 或 &a[0][0]
    4  p++;   //该语句执行过后,也就是p = p+1; p跨过行a[0][]指向了行a[1][]

    (2)指针数组

    声明示例代码如下:

    int *p[n];

    []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。

    这里执行p+1是错误的,这样赋值也是错误的:p=a;

    因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。

    但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。

    如要将二维数组赋给一指针数组:

    1 int *p[3];
    2 int a[3][4];
    3 for(i=0;i<3;i++)
    4 p[i]=a[i];

    这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]。所以要分别赋值。

    这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。

    指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。

    还需要说明的一点就是,同时用来指向二维数组时,其引用和用数组名引用都是一样的。

    比如要表示数组中i行j列一个元素:

    *(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]

    【3】数组与指针经典例子

    示例代码如下:

     1 #include<iostream>
     2 using  namespace std;
     3 void main()
     4 {
     5     char *str[]={"welcome","to","Forthmedia","Nanjing"};
     6     char **p=str+1;
     7     
     8     str[0]=(*p++)+2;
     9     str[1]=*(p+1);
    10     
    11     str[2]=p[1]+3;
    12     str[3]=p[0]+(str[2]-str[1]);
    13     
    14     cout<<str[0]<<endl;  //
    15     cout<<str[1]<<endl;  //Nanjing
    16     cout<<str[2]<<endl;  //jing
    17     cout<<str[3]<<endl;  //g
    18 }

    分析过程说明:

    str数组包含四个元素,每个元素都是一个指针,每个指针都指向了一个常量字符串

    第六行:定义一个指针p,p指向了第二个元素,其内容(*p)为“to”

    第八行:(*p++)==(*p)++;就是第二个元素再加1(指向第三个元素),然后第三个元素再加2,str[0]直接就指向了“未知区”

    第九行:(p+1)就是“Nanjing”str[1]那就指向了内容“Nanjing”

    第十一行:p[1]就是第四个元素指针,再加3,刚好为“jing”

    第十二行:因为str[1]="Nanjing;str[2]=jing;(str[2]-str[1])=3;所以,二级指针p指向内容为“jing”,那么p[0]+3的内容为“g”。

    希望仔细琢磨准确理解。

    作者:kaizen
    声明:本文版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此声明,且在文章明显位置给出本文链接,否则保留追究法律责任的权利。
    签名:顺序 选择 循环
  • 相关阅读:
    SoapUI 使用笔记
    git 使用笔记(二)
    git 使用笔记(一)
    jquery 拓展
    hdu 1024 Max Sum Plus Plus (DP)
    hdu 2602 Bone Collector (01背包)
    hdu 1688 Sightseeing (最短路径)
    hdu 3191 How Many Paths Are There (次短路径数)
    hdu 2722 Here We Go(relians) Again (最短路径)
    hdu 1596 find the safest road (最短路径)
  • 原文地址:https://www.cnblogs.com/Braveliu/p/2841458.html
Copyright © 2011-2022 走看看