caorr的个人空间 https://blog.eetop.cn/caorr [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

指针数组与数组指针

已有 4246 次阅读| 2007-6-3 01:48 |个人分类:编程语言录

天气: 晴朗
心情: 高兴

    对于C语言中的指针数组与数组指针,初次接触总会让人有些挠头,但用得多了就会觉得其实也就那么回事,所谓指针数组,就是数组,只不过它是元素为指针的数组,而所谓数组指针,就是指针,只不过它是指向数组的指针。

(1)
int a[3][4];//二维数组,存储int型的数值,编译器为这个二维数组分配了3*4个sizeof(int)的连续空间
(2)
int* b[4];//一维数组,存储int*型的数值,也就是人们常说的指针数组,该数组用来存储int型数据的地址,编译器为该一维数组分配了4个sizeof(int *)的空间
例如:
int a,b,c,d;
b[0] = &a;
b[1] = &b;
b[2] = &c;
b[3] = &d;
(3)
int (*p)[4];//这个稍微复杂一些。本语句表示的含义就是说:p是一个指向二维数组的首指针,并且这个二维数组低维的维数为4。因此,编译器只是为p分配了一个指针的空间,在32位系统中,一般是4个字节。由于它不是一个数组,因此,编译器也不会为之分配数组空间。
因此,如下赋值是不对的。
int a[3][5];
int (*p)[4] = a;//维数不匹配
但是你可以这样写:
int a[3][4];
int (*p)[4] = a;//你可以用p[1][2]等来调用a中的元素,就像用a[1][2]一样

另外还有一点,int (*p)[4] 不仅可以向上面所述的,给其赋予一个低维相同的二维数组的起始地址,它也可以用于函数参数的传递之中。可以参见最后代码中的ShowValue1。
(4)
另外二维数组在函数中的参数传递也经常采用
int p[][4]的形式。可以参考代码中的ShowValue2。
int (*p)[4]和int p[][4],都是用来指向一个低维空间为4 的二维数组的首地址。在函数的参数传递中,可见它们的效果是一样的。它们都只有一个指针的空间,因为他们只是用来记录一个数组的起始地址。
但是,int p[][4]还有不同之处。就是你不能在程序中使用
int p[][4];
或者
int a[3][4];
int p[][4]=a;
这种方式来为其赋值。它只能用于函数参数的传递。这是因为编译器在遇到 int p[][4]; 时,会将其视为普通的二维数组来处理,因此不能确定其大小,会编译出错。
但是你可以用
int n[][4] ={1,2,3,4,5,6,7,8,9,10,11,12};
来初始化一个常规的二维数组。
注意!!!


附参考代码:
#include "stdafx.h"

void ShowValue1(int (*p)[4])
{
    int i,j; 
    for(i = 0; i< 3; i++) 
    { 
        for(j = 0 ; j < 4 ; j++) 
        printf("%d ",p[i][j]); 
        printf("\n"); 
    }

}

void ShowValue2(int p[][4])

    int i,j; 
    for(i = 0; i< 3; i++) 
    { 
        for(j = 0 ; j < 4 ; j++) 
        printf("%d ",p[i][j]); 
        printf("\n"); 
    }

}

int main(int argc, char* argv[])

    int i,j,k=0; 
    int a[3][4]; 
    for(i = 0 ;i < 3; i++) 
        for(j = 0 ; j < 4 ; j++) 
            a[i][j] = k++;

    int (*p)[4]; //可以首先定义,然后再赋值 
    p = a; 
    for(i = 0; i< 3; i++) 
    { 
        for(j = 0 ; j < 4 ; j++) 
            printf("%d ",p[i][j]); 
        printf("\n"); 
    }

    int (*c)[4] = a; //在定义时即进行初始化 
    for(i = 0; i< 3; i++) 
    { 
        for(j = 0 ; j < 4 ; j++) 
            printf("%d ",c[i][j]); 
        printf("\n"); 
    }

//int l[][4];//error
//int m[][4] = a; //error

    ShowValue1(a); 
    ShowValue2(a);

    return 0;
}


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 0

    获赞
  • 8

    评论
  • 211

    访问数
关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-22 02:09 , Processed in 0.015311 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部