c语言,数组和指针

概要:

1.普通数组与指针

2.数组指针

3.指针的数组

数组是一个由(同一类型)连续元素组成的预先分配的内存块;指针是一个对任何位置的元素的引用。

数组自动分配空间,但不能重分配或改变大小;指针必须被赋值以指向分配的空间,可以随意重新赋值。

指针可以模拟数组;几乎没有所谓数组的东西,实际是个指针操作符。

1.普通数组和指针

#include <stdio.h>

int main()
{

    int arry[10];
    int *p=arry;
    arry[1]=100;
    printf("arry[1]=%d,p[1]=%d 
",arry[1],p[1]);
    
    return 0;
}
/*
root@oucaijun:/work/dcc# gcc *.c; ./a.out
arry[1]=100,p[1]=100 
*/

  

2.数组指针

为什么数组的指针在声明时一定说明数组最后一个维度的大小呢?答案很简单。

数组指针虽然是一种指向指针的指针,但是,既然我们称其为数组指针而不是普通的指向指针的指针,就是因为他们之间有一个根本性的区别。

普通指向指针的指针,在类型信息描述中,包含的是其指向的指针变量占用的空间(也就是说,恒为2);

而数组指针在类型信息里面包含了数组的大小信息(在多维数组指针中,可以忽略前面各个维度的大小,但是不能忽略最后一个维度的大小,在随后的章节中,我们将详细讲解其中的原因)。

通俗的说:作为一个数组指针,要想与普通的“指向指针的指针”划清界限、标新立异,就必须要包含数组的大小信息,否则就“没有脸面被称之为数组指针”。

因此,对于一个指向数组的指针来说,要想证明自己是一个真正的“数组指针”而不是普通的“指向指针的指针”,就必须拥有数组大小“这一关文凭'。而且,这一“文凭”在数组指针参与sizeof()运算时还要出具。如果sizeof()发现其出具的文凭等级不够,编译器会报告错误。

#include <stdio.h>

int main()
{

    int i, j;
    int arry[2][3]={ {11,12,13}, {21,22,23}};	

    int (*q)[][3]=&arry; //q是一个指针,该指针指向一个x*3二维数组,数组内的数据元素是int。
    int (*p)[2][3]=&arry; //p是一个指针,该指针指向一个2*3二维数组,数组内的数据元素是int。
    
    //printf("sizeof(*q)=%d
",sizeof(*q)); // error: invalid application of ‘sizeof’ to incomplete type ‘int[][3]’
    printf("sizeof(*p)=%d
",sizeof(*p)); 
    printf("sizeof(arry)=%d
",sizeof(arry)); 
       
    for(i = 0; i < 2; i++ ){
        for(j = 0; j < 3; j++ ){
            printf("arry[%d][%d] = %d
", i, j, arry[i][j]);
        }
    }
    
    for(i = 0; i < 2; i++ ){
        for(j = 0; j < 3; j++ ){
            printf("(*q)[%d][%d] = %d
", i, j, (*q)[i][j]);
        }
    }
    
    for(i = 0; i < 2; i++ ){
        for(j = 0; j < 3; j++ ){
            printf("(*p)[%d][%d] = %d
", i, j, (*p)[i][j]);
        }
    }
    
    return 0;
}
/*
root@oucaijun:/work/dcc# gcc *.c; ./a.out
sizeof(*p)=24
sizeof(arry)=24
arry[0][0] = 11
arry[0][1] = 12
arry[0][2] = 13
arry[1][0] = 21
arry[1][1] = 22
arry[1][2] = 23
(*q)[0][0] = 11
(*q)[0][1] = 12
(*q)[0][2] = 13
(*q)[1][0] = 21
(*q)[1][1] = 22
(*q)[1][2] = 23
(*p)[0][0] = 11
(*p)[0][1] = 12
(*p)[0][2] = 13
(*p)[1][0] = 21
(*p)[1][1] = 22
(*p)[1][2] = 23
*/

  

3.指针的数组

这个没甚么特别的。

原文地址:https://www.cnblogs.com/mylinux/p/4668216.html