嵌入式c語言基礎 --陣列與指標
阿新 • • 發佈:2018-12-03
嵌入式c語言基礎 1.指標與陣列 指標是一種變數的型別,存放某一元素的地址 指標獲取陣列中的值 #include <stdio.h> int main(void) { int a = 10; int *p = &a; char ch = 'A'; char *p_ch = &ch; printf("a:%d\n",a); printf("*p:%d\n",*p); //*p 表示 p 指向的地址中存放的數 printf("&a:%p\n",&a); //& 取地址 符號 printf("p:%p\n",p); //p是一個地址名,存放的是地址。像變數名存放變數 printf("&p:%p\n",&p); // 指標本身也是變數,也需要地址存放 ,檢視存放指標變數的地址 printf("p+1:%p\n",p+1); //指標的計算 加1,表示加一個int的長度 4個位元組 printf("p_ch:%p\n",p_ch); printf("p_ch+1:%p\n",p_ch+1); //表示加一個字元char的長度,1個位元組 return 0; } a:10 *p:10 &a:0x7fffa35d1b5c p:0x7fffa35d1b5c &p:0x7fffa35d1b60 p+1:0x7fffa35d1b60 p_ch:0x7fffa35d1b5b p_ch+1:0x7fffa35d1b5c 2.陣列與指標 注意二維陣列的指標表示 #include <stdio.h> int main(void) { int array[10] = {0,1,2,3,4,5,6,7,8,9}; printf("%d\n",array[0]); array[7] = 70; printf("%d\n",array[7]); printf("%p\n",array); //陣列的地址(第一個元素的地址) printf("%p\n",&array[0]); //第一個元素的地址(與上一句的結果相同) printf("%d\n",*array); //第一個地址存放的數 printf("%p\n",(array+1)); //指標的計算。與下一句相同 printf("%p\n",&array[1]); int array_m[3][2] = {{1,2},{3,4},{5,6}}; // 多維陣列 printf("%d\n",array_m); //{1,2} 的地址 -----------------------------------------------有點暈 printf("%d\n",*(*(array_m+1)+1)); printf("%d\n",*(*(array_m))); //利用指標獲取值,總結的規律。理解不了指標就記下這些公式 //array[n] == *(array+n); //array[n][m] == *(*(array+n)+m); //array[n][m][o] == *(*(*(array+n)+m)+o); } 0 70 0x7fff66be95f0 0x7fff66be95f0 0 0x7fff66be95f4 0x7fff66be95f4 1723766224 4 1 3.陣列指標【指向一個數組的指標】 注意形式 #include <stdio.h> #include <stdlib.h> //typedef int (*p_arr_t)[3]; #定義一個新的指標型別 typedef的用法 int main(void) { int array[3] = {1,2,3}; int (*p_arr)[3] = &array;//定義一個數組指標 int (*p_arr)[3] ¥¥¥¥¥ //int (*p_arr)[3] = array;// 陣列首元素地址 與上一句的結果相同,但是意義不同,這句表示陣列指標是錯誤的,只能用上一句 //p_arr_t p_arr = &array; //使用typedef的定義指向陣列的指標 printf("%d\n",(*p_arr)[2]); //*p_arr 指向陣列 ¥¥¥¥¥ } 4.指標陣列 一個數組裡放的都是一堆指標 int main(void) { int count; char * string[4] = {"hello worlf\n","I am\n ","who are you doing","good bay"}; for(count=0;count<4;count++){ printf(string[count]); } } hello worlf I am who are you doinggood bay 5.函式指標 指向函式的指標 #include <stdio.h> #include <stdlib.h> double Add(double a,double b) {return(a+b);}; double (*p_func)(double a,double b) = Add; //typedef double (*p_func_t)(double a,double b); int main(void) { // pfunc_t p_func = Add; double x = 10; double y = 20; double c = 22.3; double d = 456.2; printf("%p\n",Add); // 返回函式的地址 printf("%lf\n",Add(x,y)); printf("%lf\n",p_func(c,d)); printf("%p\n",p_func); } 0x40052d 30.000000 478.500000 0x40052d 6.返回指標的函式 #include <stdio.h> #include <stdlib.h> char *mystrcat(const char * src1, const char * src2){ static char string[1000]; sprintf(string,"%s%s",src1,src2); return (string); } int main(void) { char * string1 = "hello"; char * string2 = "world"; printf("%s\n",mystrcat(string1.string2)); } 7.小勢力 #include <stdio.h> #include <stdlib.h> double Add(double x, double y){return(x+y);} double Sub(double x, double y){return(x-y);} double Mul(double x, double y){return(x*y);} double Div(double x, double y){return(x/y);} typedef double (*p_func_t)(double ,double); //定義一個指標型別 int main() { /* 我的第一個 C 程式 */ double x = 45; double y =55; int count; p_func_t func[4] = {Add,Sub,Mul,Div}; //指標陣列 char * string[4] = {"x+y=","x-y=","x*y=","x/y="}; for(count=0;count<4;count++){ printf("%s%lf\n",string[count],func[count](x,y)); } return 0; } x+y=100.000000 x-y=-10.000000 x*y=2475.000000 x/y=0.818182