博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
指针数组与数组指针
阅读量:2382 次
发布时间:2019-05-10

本文共 1799 字,大约阅读时间需要 5 分钟。

对于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;

}

转载地址:http://ziuab.baihongyu.com/

你可能感兴趣的文章
一种自适应的柔性制造系统优化调度算法
查看>>
现代管理思想与总图设计
查看>>
原创BPR之企业流程分析模型图 FDD
查看>>
PLM技术促进现代模具企业精益化和规模化
查看>>
独一无二的IFS CAD与PDM集成工具发布
查看>>
BPR-FDD 模型图原始档
查看>>
mail
查看>>
团队管理的五项职能--学习笔记加个人理解总结
查看>>
自勉三句话--关于职业生涯规划
查看>>
grace
查看>>
test
查看>>
用友实施方法论
查看>>
系统功能清单
查看>>
ERP&MES&SCM 三兄弟发展史
查看>>
Grace的简历-v3.1
查看>>
file2
查看>>
file456
查看>>
需求定位模型
查看>>
BOM
查看>>
Eclipse Debug调试详解
查看>>