<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] # 定義 指針0-255是系統保留的,不能讀也不能寫,NULL是指向0的 ![](https://box.kancloud.cn/4c3579dc7bf9a433f280ece1d286dc94_818x402.png) 無論什么類型的指針,存的都是地址 內存地址都是無符號整形的,所以都是4個字節大小 10是四個字節 `int*` 表示我如果要改的話,對應那邊數據的四個字節 `char*` 的話那就是對應那邊數據的1個字節 **指針里面只是地址,指針也是個變量** ~~~ int main(int argc, char *argv[]) { int a = 10; int b = 100; //指針是一種數據類型,p是指針類型變量用來指向一個變量的地址 int * p = &a; p = &b; printf("%p\n", &b); //001CF878 printf("%X\n", p); //1CF878 //通過指針修改變量的值 *p = 200; printf("%d\n", b); //200 printf("%d\n", *p); //200 //sizeof()指針類型在內存中的大小,所有指針在32位是4個字節大小 //按照unsigned int為每一個內存分配編號 2的32次方-1 所以32位操作系統最多用4g內存 printf("%d\n", sizeof(p)); //4 printf("%d\n", sizeof(int *)); //4 printf("%d\n", sizeof(char *)); //4 system("pause"); return EXIT_SUCCESS; } ~~~ # 萬能指針指定類型 ~~~ int main(int argc, char *argv[]) { int a = 10; //指針里面存的是首地址 void * p = &a; //轉成指定類型,如果是char就轉成char *(int *)p = 100; printf("%d\n", a); //100 printf("%d\n", *(int *)p); //100 system("pause"); return EXIT_SUCCESS; } ~~~ 如果是數組 ~~~ int main(int argc, char *argv[]) { int arr[10]; //首地址 void * p = arr; //改變首地址的值也就是arr[0] *(int *)p = 100; //改變arr[1],因為里面存的是int,每個元素占用4個字節,但是已經轉為int了,int+1就過了4個字節 *((int *)p + 1) = 200; //就是arr[1] for (int i = 0; i < 10; i++) { printf("%d\n", arr[i]); } system("pause"); return EXIT_SUCCESS; } ~~~ # const `int * p` `int * `是指針的指向 p是指針的地址值 ## const修飾指針 const修飾變量是可以被修改的 ~~~ int main() { //這種方式不安全,可以通過指針修改 const int a = 10; printf("%d\n", a); int * p = &a; *p = 100; printf("%d\n", a); printf("%d\n", *p); getchar(); return EXIT_SUCCESS; } ~~~ 建議用define ~~~ #define LVL 100 ~~~ ## const修飾指針類型 ~~~ int main() { int a = 10; int b = 20; //如果const修飾int * 不能改變指針變量指向的內存地址的值 //但是可以改變指針存的地址 const int * p; p = &a; p = &b; printf("%d\n", *p); getchar(); return EXIT_SUCCESS; } ~~~ ## const修飾指針變量 ~~~ int main() { int a = 10; int b = 20; //const修飾指針變量 int * const p = &a; //能改變指針變量指向地址的值,但不能改變指針指向的地址 *p = 100; printf("%d\n", *p); getchar(); return EXIT_SUCCESS; } ~~~ ## const同時修飾指針類型和指針變量 ~~~ int main() { int a = 10; int b = 20; //const修飾指針類型并且指針變量,那么都不能改變 const int * const p = &a; getchar(); return EXIT_SUCCESS; } ~~~ ## const和非const類型轉換 當一個指針變量 str1 被 const 限制時,并且類似`const char *str1`這種形式,說明指針指向的數據不能被修改;如果將 str1 賦值給另外一個未被 const 修飾的指針變量 str2,就有可能發生危險。因為通過 str1 不能修改數據,而賦值后通過 str2 能夠修改數據了,意義發生了轉變,所以編譯器不提倡這種行為,會給出錯誤或警告。 也就是說,`const char *`和`char *`是不同的類型,不能將`const char *`類型的數據賦值給`char *`類型的變量。但反過來是可以的,編譯器允許將`char *`類型的數據賦值給`const char *`類型的變量。 這種限制很容易理解,`char *`指向的數據有讀取和寫入權限,而`const char *`指向的數據只有讀取權限,降低數據的權限不會帶來任何問題,但提升數據的權限就有可能發生危險。 C語言標準庫中很多函數的參數都被 const 限制了,但我們在以前的編碼過程中并沒有注意這個問題,經常將非 const 類型的數據傳遞給 const 類型的形參,這樣做從未引發任何副作用,原因就是上面講到的,將非 const 類型轉換為 const 類型是允許的 # 指針和數組 指針遍歷數組 ~~~ int main() { //數組名是數組的首地址,這是個常量 int arr[10] = { 0 }; //指向數組的指針,當操作指針的時候,間接操作了數組 int* p = arr; for (int i = 0; i < 10; ++i) { // printf("%d\n", p[i]); //這樣也可以 printf("%d\n", *(p+i)); } getchar(); return EXIT_SUCCESS; } ~~~ 指針操作數組 ~~~ int main() { //數組名是數組的首地址,這是個常量 int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; //指向數組的指針,當操作指針的時候,間接操作了數組 int *p = arr; //指針操作數組 *p = 100; *(p + 1) = 200; p[5] = 300; *(p + 3) = 700; for (int i = 0; i < 10; ++i) { // printf("%d\n", p[i]); //這樣也可以 printf("%d\n", *(p + i)); } getchar(); return EXIT_SUCCESS; } ~~~ # 多級指針 ~~~ int main() { int a = 10; int* p = &a; int** pp = &p; int*** ppp = &pp; //所以 ***ppp = a getchar(); return EXIT_SUCCESS; } ~~~ ![](https://box.kancloud.cn/509467709d75397002bdd26f7aa68e4a_1548x284.png) # 字符常量 ~~~ int main() { //字符數組,創建位置在棧區 char arr[] = "hello world"; //字符串常量,會在程序運行時,常量區,不能被修改的 // char * arr = "hello world"; printf("%p\n", arr); printf("%s\n", arr); getchar(); return EXIT_SUCCESS; } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看