天天看點

數組類型——typedef定義的數組類型的函數調用

Typedef 定義數組類型:代碼如下(vs2013)(不能實作數組傳遞)

【v1.0】

typedef unsigned char ElemType[6];

int Return(ElemType **p){

ElemType a = { 'q', 'm', 'e', 'u', 'p', 'y' };

*p = &a;

return 1;

}

main(){

ElemType *e;

Return(&e);

}

用Typedef 定義的數組類型來定義指針

ElemType *p;等價于typedef unsigned char (*p)[6];

參考譚浩強的書上指向數組的指針的知識。“p”為指向數組的指針,可以了解為二維數組。”p+1”為指向下一行,但是不取該行。“*p”便是對二維數組取行的操作,是行的首位址。“*p+1”是在行的基礎上偏移一列,是元素的位址。“**p”先取該行位址,再取首位址的元素,輸出為0号元素。“*(*p+i)”取該行第i号元素。

    在Return()函數中,形參定義為ElemType *p時,對指針指派時為 “p=a;” 如果用 ”*p=a;” 是無法辦到的。因為 ”*p”是一維數組,也是首位址,就像 “a” 一樣(數組變量名不能指派),是以會報錯“*p”不能作為左值(當然這裡可以調用函數memcpy()來代替指派語句)。對于“p=a;” 該語句是不能将數組“a” 一次性傳出去的。因為改變的是子函數的形參。

【v2.0】

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

typedef unsigned char ElemType[6];

int Return(ElemType **p){

    static ElemType a = { 'q', 'm', 'e', 'u', 'p' };

    *p = &a;

    return 1;

}

main(){

    ElemType **e;

    e = (ElemType **)malloc(sizeof(ElemType));

    Return(e);

    int i = 0;

    for (; i < 6; ++i){

        printf("e+%d:      %x\n", i, e + i);

        printf("*e+%d:     %x\n", i, *e + i);

        printf("**e+%d:    %x\n", i, (**e) + i);

        printf("*(**e+%d):%c\n",i,*((**e) + i));

        printf("\n");

    }

}

    1.0版本看似沒錯,但得不到想要的輸出(如果沒有關鍵字 static)。把2.0版本中的for()拷貝到1.0版本中,你就會發現輸出的根本不是想要是資料。“a” 在定義的時候定義的位址能夠傳給指針“e”,但是 “a”位址裡面的内容完全無法保證,因為當子函數結束時,對應的記憶體會釋放作他用。

    第二點是for()中的第一個printf()。“*e+i”是跳行,位址每次加”i*sizeof(ElemType)”。按理來說 ”e+i“表示位址按頁的大小來增加,但是輸出結果顯示每次加“i*4”. 也就是說位址是按“i” 的變量類型來加的(4個位元組表示一個int型變量)。