最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言中的指針 初階

 更新時間:2021年10月12日 09:08:01   作者:地火轟雷  
這篇文章主要介紹的是關(guān)于初級階段學習C語言中指針的一些內(nèi)容,那就是指針是什么?簡單的說,就是通過它能找到以它為地址的內(nèi)存單元。下面文章我們就來詳細介紹該內(nèi)容,需要的朋友可以參考一下

1.指針是什么

初學者都有一個疑問,那就是指針是什么?簡單的說,就是通過它能找到以它為地址的內(nèi)存單元。

地址指向了一個確定的內(nèi)存空間,所以地址形象的被稱為指針。

int main()
{
 int a = 10;
 int* pa = &a;
    
    return 0;
}
//pa是用來存放地址(指針),所以pa是指針變量。

總結(jié):指針就是變量,用來存放地址的變量。(存放在指針中的值都被當成地址處理)。

​ 地址是唯一標識一塊空間的。

​ 指針的大小在32位平臺是4個字節(jié),在64位平臺是8個字節(jié)。

2.指針和指針類型

我們知道變量有不同的類型(整型、浮點型、字符型等),其實指針也是有不同類型的。

​ 指針類型的意義1:

指針類型決定了指針解引用操作的時候,一次訪問幾個字節(jié)(訪問內(nèi)存的大?。?br /> char* 指針解引用訪問1個字節(jié)
int* 指針解引用訪問四個字節(jié)

int main()
{
 char* pc = &a;
 *pc = 0;
    
 return 0;
}

​ 指針類型的意義2:

指針類型決定了,指針±整數(shù)的時候的步長(指針±整數(shù)的時候,跳過幾個字節(jié))
int* 指針+1 跳過四個字節(jié)
char* 指針+1 跳過一個字節(jié)

int main()
{
 int a = 10;
 int* pa = &a;
 char* pc = &a;

 printf("%p\n", pa);
 printf("%p\n", pc);

 printf("%p\n", pa+1);
 printf("%p\n", pc+1);

 return 0;
}

3.野指針

​ 野指針就是指針指向的位置是不可知的(隨機的、不正確的、沒有明確限制的)。

3.1野指針成因

指針未初始化

int main()
{
    int* p;//局部變量指針未初始化,默認為隨機值
    *p = 20;//通過p中存的隨機值作為地址,找到一個空間,這個空間不屬于我們當前的程序
    //就造成了非法訪問,p就是野指針
    
    return 0;
}

指針越界訪問

int main()
{
    int arr[10] = 0;
    int i = 0;
    int* p = arr;
    
    for(i =0; i <= 10; i++)
    {
        *p = i;
        p++;//當指針指向的范圍超出數(shù)組arr的范圍時,p就是野指針
    }
    
    return 0;
}

指針指向的空間釋放

int* test()
{
    int a = 10;
    return &a;
}

int main()
{
    int* p = test();
    printf("%d\n",*p);
    
    return 0;
}

3.2如何規(guī)避野指針

  • 指針初始化
  • 小心指針越界
  • 指針指向空間釋放即使置NULL
  • 避免返回局部變量的地址
  • 指針使用之前檢查有效性
int main()
{
    int a = 10;
    int* p = &a;//明確地初始化,確定指向
    
    int* p2 = NULL;//不知道一個指針當前應該指向哪里時,可以初始化為NULL
    
    return 0;
}

4.指針的運算

4.1指針±整數(shù)

#define N_VALUES 5
float values[N_VALUES];
float* vp;
for(vp = &values[0]; vp < &values[N_VALUES];)
{
    *vp++ = 0;
}

int main()
{
    int arr[10] = {1,2,3,4,5,6,7,8,9,0};
    int* p = &arr[9];
    
    printf("%p\n",p);
    printf("%p\n",p-2);
    
    return 0;
}

4.2指針-指針

指針-指針 得到的數(shù)字的絕對值是指針和指針之間元素的個數(shù)

int main()
{
 int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
 printf("%d\n", &arr[9] - &arr[0]);
 printf("%d\n", &arr[0] - &arr[9]);
    
 return 0;
}

指針-指針 的前提是兩個指針指向同一塊區(qū)域

int main()
{
    int arr[10] = {1,2,3,4,5,6,7,8,9,0};
    char ch[5] = {0};
    printf("%d\n",&arr[9] - &ch[0]);//err
    
    return 0;
}

應用 求字符串長度

int my_strlen(char* s)
{
 int count = 0;
 char* start = s;
 while(*s!='\0')
 {
  s++;
 }
 return s - start;
}

int main()
{
 char arr[] = "abcdef";
 int len = my_strlen(arr);
 printf("%d\n", len);
    
 return 0;
}

4.3指針的關(guān)系運算

#define N_VALUES 5
float values[N_VALUES];
float *vp;
for(vp = &values[N_VALUES]; vp > &values[0];)
{
    *--vp = 0;
}

上述程序也可以寫成這樣

for(vp = &values[N_VALUES-1]; vp >= &values[0];vp--)
{
    *vp = 0;
}

實際在絕大部分的編譯器上是可以順利完成任務的,然而我們還是應該避免這么寫,因為標準并不保證它可行。

標準規(guī)定

​ 允許指向數(shù)組元素的指針與指向數(shù)組最后一個元素后面的那個內(nèi)存位置的指針比較,但是不允許與指向第一個元素之前的那個內(nèi)存位置的指針進行比較。

5.指針和數(shù)組

數(shù)組 - 是一塊連續(xù)的空間,放的是相同類型的元素

數(shù)組大小和元素類型,元素個數(shù)有關(guān)系

指針(變量) - 是一個變量,放地址

指針變量的大小 是4(32bit)/8(64bit)byte

數(shù)組名確實是首元素地址

但是有兩個例外:

  • sizeof(數(shù)組名) - 這里的數(shù)組名不是首元素的地址,是表示整個數(shù)組的,這里計算的是整個數(shù)組的大小,單位還是字節(jié)。
  • &數(shù)組名 - 這里的數(shù)組名不是首元素的地址,是表示整個數(shù)組的,拿到的是整個數(shù)組的地址
int main()
{
 int arr[10] = { 0 };
 int sz = sizeof(arr);
 printf("%d\n", sz);
 return 0;
}

int main()
{
 int arr[10] = { 0 };
 int* p = arr;
 int i = 0;
 int sz = sizeof(arr) / sizeof(arr[0]);
 for (i = 0;i < sz;i++)
 {
  *(p + i) = i;
 }
 for (i = 0;i < sz;i++)
 {
  printf("%d ", *(p + i));
 }

 return 0;
}

6.二級指針

我們都知道,指針變量是變量,是變量就有地址,那么指針變量的地址存放在哪里呢?

這就是我們要了解的二級指針。

int main()
{
    int a = 10;
    int* p = &a;
    int** pp = &p;//pp就是二級指針
    **pp = 20;
    printf("%d\n", a);//a = 20
    return 0;
}

7.指針數(shù)組

​ 從名字上來看,大家覺得指針數(shù)組是指針還是數(shù)組?

答案是數(shù)組,是存放指針的數(shù)組。

整型數(shù)組 - 存放整型的數(shù)組就是整型數(shù)組
字符數(shù)組 - 存放字符的數(shù)組就是字符數(shù)組
指針數(shù)組 - 存放指針的數(shù)組就是指針數(shù)組
int* 整型指針的數(shù)組
char* 字符指針的數(shù)組

int main()
{
 int arr[10];
 char ch[5];
    
 int* parr[5];
 char* pc[6];

 return 0;
}

int main()
{
 int a = 10;
 int b = 20;
 int c = 30;
 int* parr[3] = { &a,&b,&c };
 for (int i = 0;i < 3;i++)
 {
  printf("%d\n", *(parr[i]));
 }

 return 0;
}

到此這篇關(guān)于C語言中的指針 初階的文章就介紹到這了,更多相關(guān)C語言中的指針內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實現(xiàn)繪制立體餅圖的示例代碼

    C語言實現(xiàn)繪制立體餅圖的示例代碼

    這篇文章主要為大家詳細介紹了如何使用C語言實現(xiàn)繪制立體餅圖,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-03-03
  • C++數(shù)據(jù)結(jié)構(gòu)之單鏈表

    C++數(shù)據(jù)結(jié)構(gòu)之單鏈表

    這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)之單鏈表,鏈表是由一個個結(jié)點鏈結(jié)成的。結(jié)點包括數(shù)據(jù)域和指針域兩部分,數(shù)據(jù)域用來存儲數(shù)據(jù)元素的信息,指針域用來存儲下一個結(jié)點的地址,更詳細內(nèi)容請需要的小伙伴參考下面文章內(nèi)容
    2022-01-01
  • 詳解C++中的四種類型轉(zhuǎn)換運算符

    詳解C++中的四種類型轉(zhuǎn)換運算符

    隱式類型轉(zhuǎn)換是安全的,顯式類型轉(zhuǎn)換是有風險的,C語言之所以增加強制類型轉(zhuǎn)換的語法,就是為了強調(diào)風險,讓程序員意識到自己在做什么,本文將給大家詳細介紹一下C++中的四種類型轉(zhuǎn)換運算符,需要的朋友可以參考下
    2023-09-09
  • C++語義copy and swap示例詳解

    C++語義copy and swap示例詳解

    這篇文章主要為大家介紹了C++語義copy and swap示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • matlab遺傳算法求解車間調(diào)度問題分析及實現(xiàn)源碼

    matlab遺傳算法求解車間調(diào)度問題分析及實現(xiàn)源碼

    這篇文章主要為大家介紹了matlab遺傳算法求解車間調(diào)度問題解析,文中附含詳細實現(xiàn)源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02
  • c++如何在主函數(shù)文件中調(diào)用其他函數(shù)文件

    c++如何在主函數(shù)文件中調(diào)用其他函數(shù)文件

    這篇文章主要介紹了c++如何在主函數(shù)文件中調(diào)用其他函數(shù)文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語言入門篇--變量的左值和右值

    C語言入門篇--變量的左值和右值

    本篇文章是基礎(chǔ)篇,適合c語言剛?cè)腴T的朋友,本文對初識c語言的指針和指針變量做了簡單的分析,幫助大家快速入門c語言的世界,更好的理解c語言
    2021-08-08
  • C語言正則表達式操作示例

    C語言正則表達式操作示例

    這篇文章主要介紹了C語言正則表達式操作,結(jié)合實例形式分析了C語言正則匹配類似郵箱格式功能的實現(xiàn)技巧,需要的朋友可以參考下
    2017-07-07
  • C++11新特性之變長參數(shù)模板詳解

    C++11新特性之變長參數(shù)模板詳解

    本文主要介紹了C++11變長參數(shù)模板,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-08-08
  • 詳解c++11以正確的姿勢輸出enum class的值

    詳解c++11以正確的姿勢輸出enum class的值

    這篇文章主要介紹了詳解c++11以正確的姿勢輸出enum class的值,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10

最新評論

宜兰市| 南开区| 通海县| 翁牛特旗| 九龙县| 桃园县| 天等县| 吴旗县| 大庆市| 玉树县| 武隆县| 平阳县| 司法| 隆子县| 南宫市| 双鸭山市| 榕江县| 茶陵县| 同仁县| 班玛县| 湘西| 安仁县| 桃园市| 晋城| 大埔区| 英吉沙县| 卓资县| 弥勒县| 依安县| 钟祥市| 嘉义县| 随州市| 宁安市| 儋州市| 延边| 溆浦县| 佳木斯市| 牙克石市| 海淀区| 平邑县| 蕉岭县|