日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【C语言】指针基础知识点汇总

發布時間:2024/3/12 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C语言】指针基础知识点汇总 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

指針(一) 基礎

一 指針的概念

  • 為了方便訪問內存中的內容,給每個內存單元一個編號,我們稱這個編號為地址,及為指針.
  • 指針也是一種數據類型 所以指針都有自己的內存 存儲的是地址(編號)
  • 指針的四要素

  • 指針本身的類型 除去指針名,剩下的就是指針本身的類型
  • 指針指向的類型 除去指針名和一個*,剩下的就是指針指向的類型
  • 指針本身的內存 用來存儲一個編號(4字節)
  • 指針指向的內存 可以是各種類型
  • int num = 0; // 類型: intint arr[10] = {}; // 類型: int [10]int* MuShan = {1,2,3};//去掉名字,剩下的就是類型

    ?

    二 指針的定義

    1 運算符

    *: 定義時,表示定義的是一個指針 其他的時候表示解析引用

    &: 取地址符(用于取地址)

    2 定義

    指針的定義有多種理解方式;

  • 類型 變量名;
  • int* p; // 類型: int// 變量名: *p
  • 指針本身類型 指針名;
  • int* p; // 指針本身的類型: int*// 指針名: p
  • 指針指向的類型* 指針名;
  • int* p; // 指針指向的類型: int// 指針名: p

    反推:

  • 除去指針名,剩下的就是指針本身的類型
  • 除去指針名和一個*,剩下的就是指針指向的類型
  • int****** p1; // p1本身的類型: int****** // p1指向的類型: int***** (6級指針可以指向5級指針)

    三 指針的內存

  • 所有的指針,無論類型,在內存中都占4個字節的內存(存的是地址)(具體和64/32位環境相關)
  • #include <stdio.h> int main() {char* pch;short* psh;int* pn;float* pf;double* pd;printf("%d\n", sizeof(pch)); // 4printf("%d\n", sizeof(psh)); // 4printf("%d\n", sizeof(pn)); // 4printf("%d\n", sizeof(pf)); // 4printf("%d\n", sizeof(pd)); // 4return 0; }
  • 指向起始地址
  • int num = 10; int* p = &num;

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-naQJWXaU-1644340436740)(C:\Users\admin\Desktop\六星教育\學習\指針\指針(一)]\指針基礎(一)1-1.png)

    四 指針的初始化與賦值

    1 用對應類型變量的地址

    int num = 10;int* pn = &num; //初始化float f = 3.14f;float* pf;pf = &f; //賦值

    2 用相同類型的指針

    int num = 10;int* pn = &num; // 初始值int* p1 = pn; // 初始化int* p2;p2 = pn; // 賦值

    3 直接用地址

    int* p = (int*)0x36;

    4 用數組名

    一級指針可以接受一堆一位數組的數組名

    int arr[5] = { 1,2,3,4,5 };int* p = arr;

    5 字符串

    #include <stdio.h> int main() {// 數組名就是數組的首地址char arr[5] = { 'a','b','c' };char* p = arr;printf("%s\n",p); //輸出:abcchar str[5] = "abcd";p = str;printf("%s\n", str); //輸出:abcdprintf("%s\n", p); //輸出:abcd// ==> char*類型的指針可以直接用來打印整個字符串到'\0'停止const char* p1;p1 = "1234";printf("%s\n",p1); //輸出:1234const char* p2 = "Mushan";printf("%s\n",p2); //輸出:Mushanreturn 0; }

    6 置空

    int* p = NULL;int* p1 = (int*)0x0; /*NULL: #define NULL 00地址有時候,指針定義好了,但是暫時沒有指向或者是,指針用完了,沒有指向了指針不知道指向哪里(會隨機指向)此時的指針,很危險(野指針)所以 這些情況下的指針統一安排一個地址給他們指向指向0地址 */

    7 多級指針

    #include<stdio.h>int main() {int num = 10;printf(" num = %d\n", num); // num = 10;printf("&num = %X\n", &num); // &num = 10FFA78int* p = &num;printf("*p = %d\n", *p); // *p = 10 (num值)printf(" p = %X\n", p); // p = 10FFA78 (num的地址)printf("&p = %X\n", &p); // &p = 10FFA6Cint** pp = &p; // 一個二級指針printf("**pp = %d\n", **pp); // **pp = 10 (num值)printf(" *pp = %X\n", *pp); // *pp = 10FFA78 (num的地址)printf(" pp = %X\n", pp); // pp = 10FFA6C (p的地址)printf(" &pp = %X\n", &pp); // &pp = 10FFA60 int*** ppp = &pp; // 一個三級指針printf("***ppp = %d\n", ***ppp); // ***ppp = 10 (num值)printf(" **ppp = %X\n", **ppp); // **ppp = 10FFA78 (num地址)printf(" *ppp = %X\n", *ppp); // *ppp = 10FFA6C (p的地址)printf(" ppp = %X\n", ppp); // ppp = 10FFA60 (pp的地址)printf(" &ppp = %X\n", &ppp); // &ppp = 10FFA54return 0; }

    五 指針的加減法

    核心:指針本身的值(指向)沒有變化

    指針偏移

  • 指針可以加上或減去一個整數

  • 指針加上或減去一個整數后,實際上是進行了偏移

  • 偏移的范圍是加上或減去的整數個單位

    單位: 指針指向的類型在內存中所占字節數

    偏移:指針指向不變,但是可以根據偏移量取內容

  • #include <stdio.h> int main() {int num = 10;int* p = &num;printf("%X\n", p); // EFFB5Cprintf("%X\n", p + 1); // EFFB60return 0; }

    六 指針的自增自減

    自增自減,會改變指針指向

    ++:表示指針向后移動一個單位

    – :表示指針向前移動一個單位

    單位:指針指向的類型在內存所占內存中所占的字節數

    #include <stdio.h> int main() {int num = 10;int* p = &num;printf("%X\n", p); // EFFB5Cprintf("%X\n", p + 1); // EFFB60printf("%d\n",*p); // 10printf("%X\n", p += 1); // EFFB60printf("%d\n",*p); // -858993460(無意義)return 0; }

    七 通過指針遍歷數組

    遍歷一維數組

    #include <stdio.h> int main() {int arr[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };for (size_t i = 0; i < 10; i++){printf("%2d", arr[i]);}printf("\n");int* p = arr;// p和arr,除了arr是一個常量之外,其他幾乎是一樣的for (size_t i = 0; i < 10; i++){printf("%2d", p[i]);}printf("\n");printf("%d\n", p[0]); // 0printf("%d\n", *(p + 0)); // 0printf("%d\n", p[1]); // 1(先偏移 后取值)printf("%d\n", *(p + 1)); // 1// p[n] <==> *(p+n)return 0; } // p[n]:叫做下標形式 // *(p+n):叫做指針偏移的形式

    遍歷二維數組

  • 二維數組也是數組

  • 二維數組可以看成元素是一維數組的一維數組

  • 數組的內存是連續的

  • #include<stdio.h>int main() {int arr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};for (size_t i = 0; i < 3; i++){for (size_t j = 0; j < 4; j++){printf("%3d", arr[i][j]);}printf("\n");}int* p0 = arr[0];int* p1 = arr[1];int* p2 = arr[2];printf("\n");// 1:for (size_t i = 0; i < 4; i++){printf("%3d", p0[i]); // 1 2 3 4}printf("\n");for (int i = -4; i <= 7; i++){printf("%3d", p1[i]); // 1 2 3 4 5 6 7 8 9 10 11 12}printf("\n");for (int i = 0; i < 12; i++){printf("%3d", arr[0][i]); // 1 2 3 4 5 6 7 8 9 10 11 12}printf("\n");// 下標: 保證數組不越界即可// 2:int* p = &arr[0][0];for (int i = 0; i < 12; i++){printf("%3d", arr[0][i]); // 1 2 3 4 5 6 7 8 9 10 11 12 }printf("\n");for (int i = 0; i < 12; i++){printf("%3d", *p); // 1 2 3 4 5 6 7 8 9 10 11 12p++;}printf("\n");return 0; }

    總結

    以上是生活随笔為你收集整理的【C语言】指针基础知识点汇总的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。