C語言指針和數組知識總結(上) 一、指針的基礎 1.C語言中,變量的值能夠通過指針來改變,打印指針的語句符號可以是: %08x 2.指針的本質 指針的本質就是變量,那麼既然是變量,那麼一定會分配地址.只不過指針裡面保存的是地址. 3.傳遞地址和傳遞值的區別 函數傳參數只是一個賦值/拷貝的作用,所以在函數值傳遞和地址傳遞有如下區別: 值傳遞不能改變函數體外部的變量,地址傳遞可以改變函數體外部的變量. 4.那麼什麼場合需要用到地址傳遞呢? 注意兩點: 第一個是實現對函數體外部的變量進行修改 第二個是復雜函數數據類型傳遞的時候(極大的提高了C語言的執行效率) 5. #define led(m) m?(n = 1):(n = 0) 6.注意const的用法 int const* p 和 int *const p的區別 二、數組的基礎 1.數組是相同類型變量的有序集合. 2.數組名代表數組首元素的地址. 3.數組的地址需要用取址符號才能夠取到. 4.數組首元素的地址值和數組的地址值是一樣的. 5.數組首元素的地址和數組的地址是兩個不同的概念. 6.數組和指針一個非常重要的區別 [cpp] 1_1.c中 char* p = "abcd"; 1_2.c中 extern char* p[] 如果直接打印的話是打印的地址. 請仔細分析. 三、指針和數組的區別 1.指針形式訪問數組元素與用數組下表形式訪問數組元素兩者運行效率 對比可以發現:指針形式以遞增的方式訪問數組元素比以下標方式訪問速度更快 2.指針知識檢測的一個實例(摩托羅拉面試題) [html] #include <stdio.h> int main() { int a[] = {1,2,3,4,5}; int* p1 = (int*)(a + 1); int* p2 = (int*)(&a + 1); int* p3 = (int*)((int)a + 1); printf("%d \n %d \n %d \n",p1[3],p2[-1],p3[0]); } 打印結果如下: [html] 5 5 33554432 具體可自行分析. 3.一個處理器大小端檢測的程序實例 [html] #include <stdio.h> int main() { int a = 0x1234; char *p1 = (char*)((int)&a); char *p2 = (char*)((int)&a + 1); printf("p1 = %08x,*p1 = %x !! \n",p1,*p1); printf("p2 = %08x,*p2 = %x !! \n",p2,*p2); if((*p1) == 0x34 && (*p2) == 0x12) printf("this machine is Little edian !! \n"); else printf("this machine is Big edian !! \n"); } 打印結果如下: [html] p1 = bf84f814,*p1 = 34 !! p2 = bf84f815,*p2 = 12 !! this machine is Little edian !! 結果明了. 4.指針運算公式 指針運算可用如下公式來計算: [html] p+n = (unsigned int)p + n*sizeof(*p) ; 從這個公式中可以看出.對於數組a來說,雖然,a和&a是相等的,但是其表示的含義一定是不一樣的. 5.字符串長度 字符串長度指的是第一個'\0'結束之前的字符的個數 三、一個經典的面試題: 如何用一句話實現求字符串的長度 [html] #include <stdio.h> #include <assert.h> int strlen(char *s) { return (assert(s),(*s ? (strlen(s+1)+1):0)); } int main() { printf("%d\n", strlen( "ddwed")); return 0; }