關於C語言結構體,指針,聲明的詳細講解。——Arvin

来源:http://www.cnblogs.com/zhsh641/archive/2016/10/24/C_1.html
-Advertisement-
Play Games

關於結構體的詳細分析 只定義結構體 是結構體的名字 定義結構體變數 定義結構體並同時定義結構體變數 關於指針的詳細分析 定義指針變數: 定義指針的指針變數: 賦初值: 關於 和`int p`區別: 如果是c,我推薦 這樣的寫法因為變數定義需要放在函數開始的地方. 如果是c++,我推薦 分行寫並初始化 ...


關於結構體的詳細分析
  • 只定義結構體

    struct Student  
    {
    int age;
    char* name;
    char sex;//結構體成員
    };//(不要忘記分號)

    Student是結構體的名字

  • 定義結構體變數
    struct Student stu1, stu2;
  • 定義結構體並同時定義結構體變數

    struct Student{
    char *name;  //姓名
    int num;  //學號
    int age;  //年齡
    char group;  //所在學習小組
    float score;  //成績
    } stu1, stu2;

關於指針的詳細分析


1 #include <stdio.h>
2 #include <stdlib.h>
3 //關於指針的指針,賦值以及其意義
4 int main()
5 {
6     int a=8;//定義一個int型變數a,假設其在記憶體中的地址是1000
7     int *q;//定義指針變數q,q本身也需要記憶體存儲,假設其地址是2000
8     q=&a;//給q賦值,即a的地址1000。此時q=1000,*q=a=8;
9     int **p;//定義指針的指針變數p,同理p也需要記憶體存儲,假設其地址是3000
10     p=&q;//給變數p賦值,即q的地址2000.此時p=2000,*p=1000,**p=a=8
11     printf("%3d,%3d,%3d,%3d,%3d,%3d",a,q,*q,p,*p,**p);//輸出值依次:8,1000,8,2000,1000,8
12     return 0;
13 }

定義指針變數:int *q;
定義指針的指針變數:int **p;
賦初值:*p=100;
關於int* p;int *p區別:
如果是c,我推薦int *p,*q,*x;這樣的寫法因為變數定義需要放在函數開始的地方.
如果是c++,我推薦

int* p = null;
int* q = null;    

分行寫並初始化,int* pint *p更容易區別類型和變數名
int* p強調類型是int指針,int *p強調對象是int指針

關於使用int* pint *p依個人口味,本人建議使用後者,有點像解方程,而且利於函數整體的結構和規範,前者容易有int* p,q;這種出錯的可能性

#### 關於聲明和定義的詳細分析
在C系列語言中,任何一個變數,總是要先聲明,之後才能使用的。函數指針變數也應該要先聲明。
變數的聲明有兩種情況:

  1. 一種是需要建立存儲空間的。例如:int a 在聲明的時候就已經建立了存儲空間。
  2. 另一種是不需要建立存儲空間的。 例如:extern int a 其中變數a是在別的文件中定義的。

聲明是向編譯器介紹名字--標識符。它告訴編譯器“這個函數或變數在某處可找到,它的模樣象什麼”。
而定義是說:“在這裡建立變數”或“在這裡建立函數”。它為名字分配存儲空間。無論定義的是函數還是變數,編譯器都要為它們在定義點分配存儲空間。對於變數,編譯器確定變數的大小,然後在記憶體中開闢空間來保存其數據,對於函數,編譯器會生成代碼,這些代碼最終也要占用一定的記憶體。

總之就是:把建立空間的聲明成為“定義”,把不需要建立存儲空間的成為“聲明”。
基本類型變數的聲明和定義(初始化)是同時產生的;而對於對象來說,聲明和定義是分開的。

例如:類A
如果A a;就是一個聲明,告訴編譯器a是A類的一個對象變數,但是不進行初始化
如果以後a=new A();這就是初始化,分配了空間。
(我們聲明的最終目的是為了提前使用,即在定義之前使用,如果不需要提前使用就沒有單獨聲明的必要,變數是如此,函數也是如此,所以聲明不會分配存儲空間,只有定義時才會分配存儲空間。)

用static來聲明一個變數的作用有二:

  1. 對於局部變數用static聲明,則是為該變數分配的空間在整個程式的執行期內都始終存在。
  2. 外部變數用static來聲明,則該變數的作用只限於本文件模塊。

補充:

什麼是定義?什麼是聲明?它們之間的區別是什麼?
所謂定義就是(編譯器)創建一個對象,為這個對象分配一塊記憶體,並給它取上一個名字,這個名字就是就是我們經常所說的變數名或對象名。
聲明有2重含義:

  1. 告訴編譯器,這個名字已經匹配到一塊記憶體上,下麵的代碼用到變數或者對象是在別的地方定義的。聲明可以出現多次。
  2. 告訴編譯器,這個名字已經被預定了,別的地方再也不能用它來作為變數名或對象名。

定義和聲明的最重要區別就是:
定義創建對象併為這個對象分配了記憶體,聲明沒有分配記憶體。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • php採集神器CURL使用方法詳解 php採集神器CURL使用方法詳解 作者:佚名 更新時間:2016-10-21 作者:佚名 更新時間:2016-10-21 作者:佚名 更新時間:2016-10-21 對於做過數據採集的人來說,cURL一定不會陌生。雖然在PHP中有file_get_content ...
  • 首先我們要JavaWeb登陸的基本流程:JSP頁面發送請求——>Servlet——>Servlet通過調用方法從資料庫中得到數據並將結果返回頁面 我們先建立三個jsp頁面,包括login.jsp(登陸頁面)、index.jsp(顯示登陸成功後的信息)、error.jsp(登錄失敗的頁面),其中後兩個 ...
  • 1 概述 在進行ESB集成項目中,使用到了很多系統的介面,這些介面傳輸的數據大部分都採用了XML的格式,這樣在使用ESB開發服務時就需要對XML數據進行解析或拼接的操作,本文以項目中流程服務為例,講解一些常用的Dom4j對XML的操作。 2 名詞解釋 Dom4j:一個Java的XML API,用來讀 ...
  • 做python項目,需要用到mysql,一般用python-mysql,安裝時遇到錯誤提示如下: Command "python setup.py egg_info" failed with error code 1 Trace的關鍵信息是:sh: mysql_config: command not ...
  • 測試在進行一次性能測試的時候發現併發300個請求時出現了下麵的異常: HTTP Status 500 - Handler processing failed; nested exception is java.lang.OutOfMemoryError: unable to create new n ...
  • 【轉盤游戲】有一個轉盤,26個英文字母均勻分佈在轉盤邊緣,轉針初始位置在字母a,每次只能轉動到相鄰的字母,然後輸入一個由26個字母組成的字元串(最長100),不複位地依次轉動到相應的字母位置,問:一共需要轉多少次?編程實現。 Input:   輸入一個字元串,最長100,由26個英文字母組成。... ...
  • 前言: 我們在做自然語言學習的過程中使用Python進行編程。是用解析器的方式確實有些麻煩。在這裡給大家推薦一款集成開發環境IDE可以很方便的對Python進行項目管理,代碼自動提示,運行調試等。 簡介: 這裡不做其它IDE的推薦,直接推薦pycharm。它是大名頂頂的JetBrains公司出品的基 ...
  • 來源: POJ 註意: 總時間限制: 1000ms 記憶體限制: 65536kB 描述 魔獸世界的西面是紅魔軍的司令部,東面是藍魔軍的司令部。兩個司令部之間是依次排列的若幹城市。 紅司令部,City 1,City 2,……,City n,藍司令部 兩軍的司令部都會製造武士。武士一共有 dragon 、 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...