C 语言之二维数组与指针的常见运算

int( * p ) () 和 int  * p()区别

# int ( *p ) ()  是一个变量说明,说明p是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p)的两边的括号不能少。

# int *p()  说明p是一个指针型函数,其返回值是一个指向整型量的指针,*p两边没有括号

int   * ( * ( * fp ) ( int ) ) [10] 和 int  * ( * ( * array [5] ) () ) ()的含义

# fp 是一个指针,指向一个参数为int型的函数,返回值是一个指针,这个指针指向一个数组,这个数组中有十个元素,每个元素都是一个int型的指针
# array[5]是一个数组,数组中的每个元素都是一个指针,每个指针指向一个函数,这个函数的返回值为一个指针,每个指针指向一个函数,函数的返回值是int型的指针

表示形式

含义

&a 

指向二维数组的指针

a

二维数组名,指向一维数组a[0],即第0行首地址

a[0] , *(a+0) , *a

第0行第0列元素地址

a+1 , &a[1]

第1行首地址

a[1] , *(a+1)

第1行第0列元素地址

a[1]+2 , *(a+1)+2 , &a[1][2]

第1行第2列元素地址

*(a[1]+2) , *(*(a+1)+2) , a[1][2]

第1行第2列元素的值

# [ ] 有取值的含义

int main()
{ 
    int a[3][4] = {{1, 2, 3, 4}, {3, 4, 5, 6}, {5, 6, 7, 8}};
    int i;
    int (*p)[4] = a, *q = a[0]; 
    // int (*p)[4] = a 四个元素 每个元素 4 个字节,p+1 加 16 个字节
        a 是数组名,a+1 是加一行,一行 16 个字节,所以这条语句合法
         
    for(i = 0; i < 3; i++)
    {   
        if(i == 0)
        {
            (*p)[i + i / 2] = *q + 1;        // = (*p)[0] = a[0][0]
        
        }        
        else
        {
            p++,++q;                        
        }
    }

    for(i = 0; i < 3; i++)
    {
        printf("%d,", a[i][i]);               //打印对角线上的内容
    }

    printf("%d, %d\n", *((int *)p), *q);

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42200183/article/details/81253584
今日推荐