1. 程式人生 > >C語言中“.”與->的區別

C語言中“.”與->的區別

寫過C語言的各位朋友剛開始的時候一定受過這倆個混淆的坑吧。 看著感覺這倆個差不多啊,都是可以指向一個結構體的元素。但是,往往我們寫的時候感覺錯誤百出:
下面我指出這倆個混淆的錯誤:

這裡寫圖片描述

程式碼附上:

這裡寫圖片描述

在上圖我們看到報錯6個地方都是對結構體內元素操作時候出錯了:
接下來我們翻一下剛才的報錯看是什麼原因:

error: request for member ‘ain something not a structure or union
//錯誤:在非結構體或聯合體的情況下請求成員a
error: invalid type argument of ‘->’ (have ‘A’)
//錯誤:“->”(“A”)的無效型別引數

而我們重新認識以下”.”和->的定義和使用:
A.a:

The member access expression designates the named member of the struct or union designated by its left operand. It has the same value category as its left operand.
//成員訪問表示式指定由其左運算元指定的結構或聯合的命名成員。它具有與左運算元相同的值類別。

A->a:

The member access through pointer expression designates the
named member of the struct or union type pointed to by its left operand. Its value category is always lvalue. //通過指標表示式的成員訪問指定由其左運算元指向的結構或聯合型別的命名成員。它的值l類別始終是左值。

簡單點說就是:
A->a表示A是指向結構體的指標
A.a表示A是結構體
A->a等效於(*A).a

那我們將上面的程式碼改一下:
這裡寫圖片描述

而我們要是還看得不怎麼明白的話,我們只需要檢視一下主函式的node和呼叫函式的node大小是多少即可:
這裡寫圖片描述

看到上圖的執行結果,我們心中應該或許明白了點什麼吧:
因為我的系統是64位的,所指標的大小是8個位元位,
(為了好區分,我將結構體加了點東西,不然效果看不出來)
我們可以看到主函式的node是大小是12,而呼叫函式內部變成了8

在這個時候我們應該明白了點什麼吧,就是我們傳參時候是傳了結構體的地址,所以呼叫函式內部的node就是指向主函式node的一個結構體指標。

這裡涉及到了機構體傳參的值傳遞引用傳遞這倆個知識點,我在下面的部落格中會講到的!!

希望朋友們有收穫,以後.->千萬不要用錯了!!!

相關推薦

C言中“.”->的區別

寫過C語言的各位朋友剛開始的時候一定受過這倆個混淆的坑吧。 看著感覺這倆個差不多啊,都是可以指向一個結構體的元素。但是,往往我們寫的時候感覺錯誤百出: 下面我指出這倆個混淆的錯誤: 程式碼附上: 在上圖我們看到報錯6個地方都是對結構體內元素操作時候

C言中sizeofstrlen區別

由於 def sizeof 繼續 數組 color 例如 結束 自動添加 sizeof 初始的分配的空間大小,期中 sizeof(unsigned char) = 1; sizeof(signed char) = 1;        sizeof(int) = 4; siz

C言中%c%s的區別劃分

%c格式對應的是單個字元,%s格式對應的是字串。例:char a;char b[20];scanf("%c",&a); //只能輸入一個字元。scanf("%s",b); //可以輸入一串不超過20字元的字串。 %c對應型別為char, %s對應型別為char , 即字串. 用作

C言中exit()return的區別

1、exit函式和return函式的主要區別是: 1)exit用於在程式執行的過程中隨時結束程式,exit的引數是返回給OS的。main函式結束時也會隱式地呼叫exit函式。exit函式執行時首先會執行由atexit()函式登記的函式,然後會做一些自身的清理工作,同時重新整理所有輸出流、關閉所有開啟的流並且

C言中static全域性變數普通的全域性變數區別

下面是中興通訊2012校招筆試題的一道問答題: 1. static全域性變數與普通的全域性變數有什麼區別 ?   全域性變數(外部變數)的說明之前再冠以static 就構成了靜態的全域性變數。   全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。 這兩者在儲存方式上

C講堂 C言中“.”“->”有什麼區別

原文:https://blog.csdn.net/faihung/article/details/79190039   這雖然是個小問題,但有時候很容易讓人迷惑,因為有的時候用混淆了,程式編譯不通過。 下面說說我對它們的理解。 一般情況下用“.”,只需要宣告一個結構體。格式是,結構

c言中char *name char name 的區別

要點:char* name="abc"指的是常量字串,不可以修改指標,是相容老的寫法;char[] name="abc"是指標,可以修改;在學習過程中發現了一個以前一直預設的錯誤,同樣char *c = "abc"和char c[]="abc",前者改變其內容程式是會崩潰的,

C言中exit(0)exit(1)有什麼區別

今天天氣有點冷,當我在寫訊息佇列的程式的時候,遇到了結束程序的這個問題,突然腦海裡有點混亂,我是用_exit(),還是用exit(1),還是用exit(0)呢,然後自己度娘了一下,整理了一下稍微做

C言中的strlensizeof的區別

sizeof與strlen是有著本質的區別,sizeof是求資料型別所佔的空間大小,而strlen是求字串的長度,字串以/0結尾。區別如下: (1) sizeof是一個C語言中的一個單目運算子,而strlen是一個函式,用來計算字串的長度。 (2)sizeof求的是資

C言中的malloc/freeC++中的new/delete的區別

有以下不同: (1)new、delete 是操作符,可以過載,只能在C++中使用。(2)malloc、free是函式,可以覆蓋,C、C++中都可以使用。(3)new 可以呼叫物件的建構函式,對應的de

C言中sizeofstrlen 的區別

字符指針 系統 32位 大小 添加 std 指針 為什麽 一行 sizeof與strlen是有著本質的區別,sizeof是求數據類型所占的空間大小,而strlen是求字符串的長度,字符串以/0結尾。總的來說sizeof把‘\0‘也給數上了,而strlen遇到‘\0‘就停止計

Swift言中C/C++和Java不同的語法(五)

函數類型 fun java col str logs 默認參數 int函數 ... 這一節將會提到Swift中其他的關於函數的應用,這些內容包括有: 默認參數值和可變參數值、常量參數、返回函數類型和函數嵌套: 一、默認參數值和可變參數值 對默認參數值是指在函數的聲明中就已經

C言中,當計算字符數組長度時,用sizeof 和strlen 的原理及兩者的區別

指針 data- 編譯器 tracking 行處理 ews csdn 編譯 分配 字符數組的長度計算:必須以終止符’\0‘作為邊界,但對字符數組賦值時,有兩種方式: 1:定義時用字符初始化 (1)char chs[7] = {‘a‘, ‘c‘, ‘0‘, ‘z‘, ‘3

c言中sscanf()sprintf()的使用

strong include print int quest stdio.h 語言 控制臺 dbn #include<stdio.h> void main(void){ char * cgistr = "|Ip=192.168.1.78|Port=56

C言中static修飾的函式和普通函式的區別

用static修飾的函式,本限定在本原始碼檔案中,不能被本原始碼檔案以外的程式碼檔案呼叫。而普通的函式,預設是extern的,也就是說,可以被其它程式碼檔案呼叫該函式。 在函式的返回型別前加上關鍵字static,函式就被定義成為靜態函式。普通 函式的定義和宣告預設情況下是extern的,但靜

C言中fstat stat和lstat 區別

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C言中 .h檔案和.c檔案的區別

要理解.c檔案與.h檔案有什麼不同之處,首先需要弄明白編譯器的工作過程,一般說來編譯器會做以下幾個過程: 1.預處理階段 2.詞法與語法分析階段 3.編譯階段,首先編譯成純彙編語句,再將之彙編成跟CPU相關的二進位制碼,生成各個目標檔案 4.連線階段,將各個目標檔案中的各段程式碼進行絕對地址定位,生成跟特定平

c言中 “=”和”==“的區別

“=”   是把“=”右邊的值賦值給左邊。 如 int i;      i=2; 將整數2賦值給i “==”    是將“==”左右的值作比較。 如  if(a%2==0)                   //判斷a除2的餘數是不是為0 printf(“%d為

C言中scanf(),sscanf(),fscanf()的用法和區別

scanf(),sscanf(),fscanf()區別: 第一個是從控制檯(鍵盤)輸入; 第二個是從字串輸入; 第三個是從檔案輸入; scanf scanf()函式根據由format(格式)指定的格式從stdin(標準輸入)讀取,並儲存資料到其它引數.   int main

C言中printf(),sprintf(),scanf(),sscanf()的用法和區別

printf 語法:    #include <stdio.h>   int printf( const char *format, ... ); printf()函式根據format(格式)給出的格式列印輸出到STDOUT(標準輸出)和其它引數中。返