關於結構體的詳細分析 只定義結構體 是結構體的名字 定義結構體變數 定義結構體並同時定義結構體變數 關於指針的詳細分析 定義指針變數: 定義指針的指針變數: 賦初值: 關於 和`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* p
比int *p
更容易區別類型和變數名
int* p
強調類型是int指針,int *p
強調對象是int指針
關於使用int* p
和int *p
依個人口味,本人建議使用後者,有點像解方程,而且利於函數整體的結構和規範,前者容易有int* p,q;
這種出錯的可能性
#### 關於聲明和定義的詳細分析
在C系列語言中,任何一個變數,總是要先聲明,之後才能使用的。函數指針變數也應該要先聲明。
變數的聲明有兩種情況:
- 一種是需要建立存儲空間的。例如:int a 在聲明的時候就已經建立了存儲空間。
- 另一種是不需要建立存儲空間的。 例如:extern int a 其中變數a是在別的文件中定義的。
聲明是向編譯器介紹名字--標識符。它告訴編譯器“這個函數或變數在某處可找到,它的模樣象什麼”。
而定義是說:“在這裡建立變數”或“在這裡建立函數”。它為名字分配存儲空間。無論定義的是函數還是變數,編譯器都要為它們在定義點分配存儲空間。對於變數,編譯器確定變數的大小,然後在記憶體中開闢空間來保存其數據,對於函數,編譯器會生成代碼,這些代碼最終也要占用一定的記憶體。
總之就是:把建立空間的聲明成為“定義”,把不需要建立存儲空間的成為“聲明”。
基本類型變數的聲明和定義(初始化)是同時產生的;而對於對象來說,聲明和定義是分開的。
例如:類A
如果A a;就是一個聲明,告訴編譯器a是A類的一個對象變數,但是不進行初始化;
如果以後a=new A();這就是初始化,分配了空間。
(我們聲明的最終目的是為了提前使用,即在定義之前使用,如果不需要提前使用就沒有單獨聲明的必要,變數是如此,函數也是如此,所以聲明不會分配存儲空間,只有定義時才會分配存儲空間。)
用static來聲明一個變數的作用有二:
- 對於局部變數用static聲明,則是為該變數分配的空間在整個程式的執行期內都始終存在。
- 外部變數用static來聲明,則該變數的作用只限於本文件模塊。
補充:
什麼是定義?什麼是聲明?它們之間的區別是什麼?
所謂定義就是(編譯器)創建一個對象,為這個對象分配一塊記憶體,並給它取上一個名字,這個名字就是就是我們經常所說的變數名或對象名。
聲明有2重含義:
- 告訴編譯器,這個名字已經匹配到一塊記憶體上,下麵的代碼用到變數或者對象是在別的地方定義的。聲明可以出現多次。
- 告訴編譯器,這個名字已經被預定了,別的地方再也不能用它來作為變數名或對象名。
定義和聲明的最重要區別就是:
定義創建對象併為這個對象分配了記憶體,聲明沒有分配記憶體。