關於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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...