IOS開發之路 C 學習筆記7 25

2021-06-17 14:44:11 字數 3015 閱讀 9698

今天覆習下昨天遺漏的知識,

陣列指標與指標陣列

陣列指標是乙個指標,而指標陣列則是乙個陣列.區別在於後兩個字

定義乙個指標陣列如下

char* str[3] = ;

可以str+1;

但是不能 str++;

因為++是乙個賦值運算了

char *str =" hello"

str = "world" 正確的        此指標指向的是乙個常量

str[0]  = "w" 錯誤的  

char str[20] = "hello"

str  = "world"  錯誤的

陣列指標(也稱行指標)

定義 int (*p)[n];

()優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p+1時,p要跨過n個整型資料的長度。

如要將二維陣列賦給一指標,應這樣賦值:

int a[3][4];

int (*p)[4]; //該語句是定義乙個陣列指標,指向含4個元素的一維陣列。

p=a;        //將該二維陣列的首位址賦給p,也就是a[0]或&a[0][0]

p++;       //該語句執行過後,也就是p=p+1;p跨過行a[0]指向了行a[1]

所以陣列指標也稱指向一維陣列的指標,亦稱行指標。

指標陣列

定義 int *p[n];

優先順序高,先與p結合成為乙個陣列,再由int*說明這是乙個整型指標陣列,它有n個指標型別的陣列元素。這裡執行p+1是錯誤的,這樣賦值也是錯誤的:p=a;因為p是個不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它們分別是指標變數可以用來存放變數位址。但可以這樣 *p=a; 這裡*p表示指標陣列第乙個元素的值,a的首位址的值。

如要將二維陣列賦給一指標陣列:

int *p[3];

int a[3][4];

for(i=0;i<3;i++)

p[i]=a[i];

這裡int *p[3] 表示乙個一維陣列內存放著三個指標變數,分別是p[0]、p[1]、p[2]

所以要分別賦值。

這樣兩者的區別就豁然開朗了,陣列指標只是乙個指標變數,似乎是c語言裡專門用來指向二維陣列的,它占有記憶體中乙個指標的儲存空間。指標陣列是多個指標變數,以陣列形式存在記憶體當中,占有多個指標的儲存空間。

還需要說明的一點就是,同時用來指向二維陣列時,其引用和用陣列名引用都是一樣的。

比如要表示陣列中i行j列乙個元素:

*(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]

優先順序:()>>*

以上來自摘抄 - -.

條件預編譯

ifdef  如果定義他 …然後end if

ifndef 如果沒有定義…然後end if

typedef struct student;

1、定義乙個結構體(包括年、月、日等成員變數)並初始化。然後計算該日在本年中是第幾天?注意閏年問題。

2、編寫函式days實現上一題目,由主函式將年、月、日傳遞給days函式,計算後結果返回主函式輸出。

3、有5個學生,每個學生的資訊包括學號、姓名、3門課程的成績,從鍵盤輸入5個學生的相關資訊,要求輸出每個學員的學號、姓名、3門課程的成績,及三門課程的平均成績。注:結構體元素有:num,name,score[3]。

4、設計所需的各種各樣的輸出格式(包括整數、實數、字串等)做成巨集定義,用乙個檔案「format.h」,把這些資訊都放到此檔案中,編寫程式,用#include 「format.h」命令以確保能使用這些格式。

5、用條件編譯方法實現以下功能:

輸入一行電報文字,可以任選兩種輸出,一為原文輸出;一為將字母變成其下乙個字母(如『a』變成『b』,……『z』變成『a』。其它字元不變)。用#define命令來控制是否要譯成密碼。例如:

#define change 1

則輸出密碼。若

#define change 0

則不譯成密碼,按原碼輸出。

所有**全弄乙個檔案吧。

//

// main.c

// 結構體與位運算

//// created by x's on 13-7-25.

//#include #include "format.h"

#include #define change 1

typedef struct date

date;

// 1 or 2

int getdays(date *day)

; int i = 0;

if(year%400 ==0 || ((year%4 == 0)&&(year%100!=0)) )

}else

}days += day_d;

return days;

printf("生日是:%d-%d-%d\n",year,day_m,day_d);

printf("改日是這年的第【%d】天",days);

}typedef struct score

score;

typedef struct student

student;

// 3

void getstudent()

for (int i = 0; i<5; i++)

}5void password()

#elif (change==1)

else

i++;

}printf("%s",password);

}#endif

}void test()

int main(int argc, const char * argv)

; //getdays(&day);

//printf("%d-%d-%d\n",day.year,day.mouth,day.day);

//test();

return 0;

}

IOS開發之路 C 學習筆記7 15

今天聽的還是挺輕鬆的,但是還是學到了以前不知道的東西.比如 i 先自增 再使用 i 先使用 再自增 高精度忘低精度轉 不四捨五入直接捨掉 例 printf d int 3.14 還有幻影回車符.例用scanf輸入時 void getchar 其中輸入完4個數字之後 如輸入1 2 3 4 之後回車,輸...

IOS開發之路 C 學習筆記7 16

c語言中使用0作為假,非0即為真 與 同真為真 同假為假 其中有乙個為假 即為假 或 同真為真 同假為假 有真即真 非 非真即假 反之亦然 運算子優先順序 綜合性 從左到右 算數,單目運算子 從右到左 算術,單目運算子 從左到右 算數,雙目運算子 從左到右 關係運算子 從左到右 關係運算子 從左到右...

IOS開發之路 C 學習筆記7 17

7 17 星期3 c語言迴圈有三種 while do while forbreak 跳出迴圈 距離自己最近的 continue 跳出本次迴圈,而不結束整個迴圈,然後繼續下次迴圈 0 1 2 3 4 5 6 100 for i 0 i 100 i else sum i 今天講的迴圈結構聽的很簡單,下午...