在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C語言指針運算符詳解

嵌入式愛好者之家 ? 來源:嵌入式愛好者之家 ? 2024-10-30 11:16 ? 次閱讀

概述

C語言中,當你有一個指向數組中某個元素的指針時,你可以對該指針執行某些算術運算,例如加法或減法。這些運算可以用來遍歷數組中的元素,如ptr[i]等價于*(ptr + i)。然而,如果你的操作使得指針指向了數組以外的位置(除了數組結束位置之后的一個位置之外),那么這個指針的行為就是未定義的。

例如:

如果ptr指向數組的第一個元素,那么ptr + 1將指向第二個元素。

如果ptr指向數組的最后一個元素,那么ptr + 1將指向數組結束之后的一個虛構位置,這是允許的,但是試圖訪問該位置(如*(ptr + 1))將導致未定義行為。

如果ptr指向數組的最后一個元素,那么ptr + 2指向的位置超出了數組的范圍,這將導致未定義行為。

未定義行為意味著編譯器可以做出任何事情,包括但不限于程序崩潰、數據損壞或其他不可預測的結果。因此,在編寫涉及指針操作的代碼時,確保指針始終在安全范圍內是非常重要的。在實際編程中,常常會用到邊界檢查來防止這類問題的發生。

詳述

創建一個指向數組末尾之后的指針在標準中是有明確定義的,并且本規則允許這種操作。但是,引用通過這種方式創建的指針會導致未定義的行為,并且此規則禁止這樣做。

本規則適用于所有形式的數組索引

整數表達式 + 整數表達式

指針表達式 + 整數表達式

指針表達式 += 整數表達式

指針表達式 -= 整數表達式

++ 指針表達式

-- 指針表達式

指針表達式++

指針表達式--

整數表達式 [指針表達式]

指針表達式 [整數表達式]

注意:對于指針算術的目的,標準將不是數組成員的對象視為具有單個元素的數組。

理由

雖然一些編譯器可以在編譯時確定數組邊界是否超出,但在運行時通常不會對無效數組下標進行檢查。使用無效數組下標可能導致程序出現錯誤行為。

由于它們不容易通過靜態分析或手動審查來檢查,因此運行時推導出的數組下標值最令人擔憂。如果可能的話,應該提供代碼以檢查此類下標值的有效性,并根據需要采取適當的行動。

如果從上述表達式之一獲得的結果不是一個指向由指針表達式所指向的數組元素或一個超過該數組末尾的一個元素的指針,則其行為是未定義的。有關更多信息,請參閱C90第6.3.6節、C99第6.5.6節。

多維數組是“數組的數組”。本規則不允許導致指針指向不同子數組的指針算術。不應使用數組下標跨越“內部”邊界的數組下標,因為這樣的行為是未定義的。

示例

使用+運算符也會違反規則18.4。

int32_t f1( int32_t * const a1, int32_t a2[10][1]) 
{
  /* Compliant/non-Compliant depending on the value of a1 */
  int32_t *p = &a1[3];     
return*(a2+9);/*Compliant*/
}


void f2(void)
{
    int32_t data = 0;
    int32_t b = 0;
    int32_t c[10] = {0};
    // 5-element array of 2-element arrays of int32_t
    int32_t d[5][2] = {0}; 
 
    int32_t *p1 = &c[0];    //Compliant
    int32_t *p2 = &c[10];   // Compliant - points to one beyond
    int32_t *p3 = &c[11];   // Non - compliant - undefined, points to two beyond
    
    data = *p2;




    data = f1(&b, c);
    data = f1(c, c);
    
    p1++;         /*Compliant*/
    c[-1] = 0;    /*Non-Compliant - undefined, array bounds exceeded*/
    data = c[10];    /*Non-Compliant - undefined,dereference of address one beyond*/
   
    d[3][1] = 0;         /*Compliant*/
    data = *(*(d + 3) + 1);      /*Compliant*/
    data = d[2][3];      /*Non-compliant - undefined, internal boundary exeeded*/
    
    p1 = d[1];
    data = p1[1];
}


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7628

    瀏覽量

    139752
  • 指針
    +關注

    關注

    1

    文章

    484

    瀏覽量

    70913
  • 運算符
    +關注

    關注

    0

    文章

    172

    瀏覽量

    11296

原文標題:Rule18.1 指針運算符的結果應指向與該指針運算符相同的數組元素,否則其行為是未定義的

文章出處:【微信號:嵌入式愛好者之家,微信公眾號:嵌入式愛好者之家】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    C語言基礎知識(4)--運算符

    C語言中,運算符包括有算術運算符、關系運算符、邏輯運算符和位
    的頭像 發表于 06-15 09:38 ?4323次閱讀

    C語言中賦值運算符詳解

    C語言中,賦值運算符用于將一個值賦給變量。
    發表于 08-18 16:38 ?2511次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>中賦值<b class='flag-5'>運算符</b><b class='flag-5'>詳解</b>

    C語言運算符的使用方法

    詳細介紹了C語言表達式、算術運算符、賦值運算符、關系運算符、條件結構、邏輯運算符、位
    發表于 11-02 11:30 ?2143次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>運算符</b>的使用方法

    【跟我學單片機C語言詳解運算符和表達式的位運算符

    【跟我學單片機C語言詳解運算符和表達式的位運算符學過匯編的朋友都知道匯編對位的處理能力是很強的,但是單片機C
    發表于 12-07 13:51

    C語言運算符優先級(超詳細)

    C語言運算符優先級(超詳細) 當想找哪個運算符優先級高時,很多時候總是想找的就沒有,真讓人氣憤!現在,終于有個我個人覺得非常全的,分享給大家,歡迎拍磚!
    發表于 04-27 16:47

    C語言程序設計--運算符與表達式

    c語言對數據有很強的表達能力,具有十分豐富的運算符,利用這些運算符可以組成各種表達式及語句。運算符就是完成某種特定
    發表于 07-14 21:30 ?46次下載

    C語言入門教程-運算符優先級

    運算符優先級C語言有豐富的運算符。如果不清楚這些運算符的優先級,則在同時使用多個運算符時就容易產
    發表于 07-29 14:21 ?1372次閱讀

    單片機C語言教程-運算符和表達式

    單片機C語言教程-運算符和表達式   單片機C語言教程-運算符和表達式  
    發表于 03-27 17:13 ?2287次閱讀

    C語言運算符的使用

    C語言運算符的使用,感興趣的小伙伴們可以瞧一瞧。
    發表于 08-23 17:56 ?0次下載

    C運算符的優先級和結合性詳細解決

    運算符是一種告訴編譯器執行特定的數學或邏輯操作的符號。 C語言內置了豐富的運算符,大體可分為10類:算術運算符、關系
    的頭像 發表于 02-22 17:27 ?3481次閱讀

    C語言總結_語句、運算符

    當前文章復盤C語言的: 位運算運算符、基本運算符、數據類型、變量、for語句、while語句、goto語句、switch語句、
    的頭像 發表于 08-14 09:39 ?1202次閱讀

    c語言運算符及例題

    C語言中邏輯運算符包含邏輯與&&、邏輯或||、邏輯非!三種。其中邏輯與&&是雙目運算符,即需要運算符兩邊都要有表達式,且兩邊表達式都為真,此
    發表于 02-16 16:14 ?0次下載

    C語言運算符

    C語言中,我們常常會用到表達式,在使用表達式的過程中便會使用到運算符C語言中,不同的運算符
    的頭像 發表于 02-21 15:12 ?1405次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>的<b class='flag-5'>運算符</b>

    C語言中什么是關系運算符

    C語言中,比較稱為關系運算符,所謂關系運算就是比較運算,將兩個數值進行比較,判斷其比較的結果
    的頭像 發表于 03-09 10:47 ?2710次閱讀

    c語言從右到左的運算符有哪些

    以下是一些主要的從右到左運算C語言運算符: 函數調用運算符 ( () ):當您調用一個函數時,參數列表是從右到左進行求值的。 后置遞增
    的頭像 發表于 08-20 11:39 ?1571次閱讀
    主站蜘蛛池模板: xxxx人成高清免费图片 | 深爱五月激情五月 | 男人的天堂天堂网 | 特黄aaaaaa久久片 | 国产一级影院 | 农村苗族一级特黄a大片 | 午夜看一级特黄a大片黑 | 国产亚洲欧美成人久久片 | 色视频免费国产观看 | 精品一区二区影院在线 | 天天看人体 | 日韩欧美在线第一页 | 神马影院午夜dy888 | 中文字幕乱码人成乱码在线视频 | 国产精品bdsm在线调教 | 午夜精品久久久久久久2023 | 日本免费一区视频 | 久久影视免费观看网址 | 爱婷婷网站在线观看 | 婷婷亚洲综合 | 久久亚洲国产成人精品性色 | 国产色婷婷免费视频 | 欧美大黄 | 男男np主受高h啪啪肉 | 变态重口极致另类在线 | 久久久精品免费国产四虎 | av手机在线播放 | 欧美性狂猛bbbbbxxxxx | 日本全黄视频 | 久久网站免费观看 | 日本午夜大片免费观看视频 | 日本特级黄色大片 | 色多多网站在线观看 | 午夜香蕉视频 | 欧美日韩一区二区三区视视频 | 免费人成在线 | 五月婷婷俺也去开心 | 亚洲欧美视频在线播放 | 欧美色图28p| 五月婷婷在线观看视频 | 男女性高爱潮免费的国产 |