目的
初步掌握C語言指針和結構體的定義和使用
指針
指針的靈活運用使得c語言更加強大怜瞒,指針是C語言中十分重要的部分孔祸,可以說指針是C語言的靈魂。
為什么要使用指針
指針可以解決跨區(qū)域(不同作用域 不同代碼塊)之間的數(shù)據(jù)交互,同時使用指針
能夠創(chuàng)建動態(tài)數(shù)據(jù)結構六孵。這時內(nèi)存將在程序運行的時候從堆上分配椿浓,而不用一開始就聲明數(shù)組的最大規(guī)模太援。這樣您就可以為每個文檔準確地分配內(nèi)存而不會產(chǎn)生浪費。而且扳碍,關閉一個文檔時您還可以把它占用的內(nèi)存返回給堆提岔,以供程序的其他部分使用。使用指針笋敞,內(nèi)存就可以在程序運行期間不斷被回收利用碱蒙。
指針的使用
定義指針變量與定義普通變量非常類似,不過要在變量名前面加星號*,格式為:
datatype *name;
或者
datatype *name = value;```
*表示這是一個指針變量赛惩,datatype表示該指針變量所指向的數(shù)據(jù)的類型 哀墓。例如:
int *p1;
p1 是一個指向 int 類型數(shù)據(jù)的指針變量,至于 p1 究竟指向哪一份數(shù)據(jù)喷兼,應該由賦予它的值決定篮绰。再如:
int a = 100;
int *p_a = &a;
在定義指針變量 p_a 的同時對它進行初始化,并將變量 a 的地址賦予它季惯,此時 p_a 就指向了 a吠各。值得注意的是,p_a 需要的一個地址勉抓,a 前面必須要加取地址符&走孽,否則是不對的。
和普通變量一樣琳状,指針變量也可以被多次寫入磕瓷,只要你想,隨時都能夠改變指針變量的值念逞,請看下面的代碼:
//定義普通變量
float a = 99.5, b = 10.6;
char c = '@', d = '#';
//定義指針變量
float *p1 = &a;
char *p2 = &c;
//修改指針變量的值
p1 = &b;
p2 = &d;
注意:指針指向的內(nèi)存空間只能在存放定義數(shù)據(jù)類型的數(shù)困食,同時定義指針變量的時候一定要給初值 不確定就給NULL;NULL指向內(nèi)存的初始地址0x00翎承。
數(shù)組和指針之間的關系
定義一個數(shù)組 系統(tǒng)會分配內(nèi)存空間 可以存值
定義一個指針變量 只為變量本身分配8個字節(jié)內(nèi)存空間無法存值硕盹,因為系統(tǒng)沒有為他分配內(nèi)存空間。
那如果想給指針指向的區(qū)域賦值叨咖,應該怎么辦呢瘩例?
1.指針變量已經(jīng)指向某塊區(qū)域
int a3 = 10;
int *pa = &a3;
*pa = 30;
2.指針指向一個數(shù)組
int num2[10]= {};
int *pNum = num2;
3.動態(tài)分配內(nèi)存 malloc realloc
上面兩種指向的內(nèi)存都是別人的,現(xiàn)在分配一個屬于自己的內(nèi)存空間,而自己分配的內(nèi)存空間必須自己釋放甸各,普通變量的內(nèi)存是系統(tǒng)自己分配 垛贤,所以系統(tǒng)自己釋放當分配的空間不夠了,需要在之前的基礎上重新分配用realloc函數(shù)但必須是之前用malloc函數(shù)進行過動態(tài)分配的 系統(tǒng)自己分配的內(nèi)存則不能使用realloc來重新分配內(nèi)存趣倾,同時一旦用完了聘惦,便自己釋放內(nèi)存。
malloc():
int *pNumber = (int*)malloc(100); // 分配100字節(jié)內(nèi)存
int *pNumber = (int*)malloc(25*sizeof(int)); //存儲25個int值得內(nèi)存
用 if 語句檢查是否分配:
int *pNumber = (int*)malloc(25*sizeof(int));
if (!pNumber)
{
// 內(nèi)存分配失敗的處理代碼
}
釋放動態(tài)分配的內(nèi)存:
free(pNumber);
pNumber = NULL;
結構體
為什么要使用結構體
由于一個數(shù)組中只能存放同一種類型的數(shù)據(jù)儒恋,很不方便善绎,所以C語言允許用戶自己建立由不同類型數(shù)據(jù)組成的組合型的數(shù)據(jù)結構,也就是結構體诫尽,把一些有共同特征(比如同屬于某一類事物的屬性)的變量封裝在內(nèi)部禀酱,通過一定方法訪問修改內(nèi)部變量。
結構體的使用
聲明一個結構體類型的一般形式是
stuct 結構體名
{成員列表};
例如先聲明結構體類型牧嫉,再定義該類型變量:
{
int num;
char name[20];
char sex;
int age;
}
struct student S1,S2;
或者在聲明定義的同時定義變量:
struct student
{
int num;
char name[20];
char sex;
int age;
}S1,S2;
結構體變量的初始化和引用
#include <stdio.h>
int main()
{
struct student
{
char name[20];
int age;
};
struct student XW1={"zhangsan",18};
printf("name:%s age:%d\n"XW1.name,XW1.age);
return 0;
}
今日小結
今天所講的內(nèi)容可能是整個C語言中最難的一塊了剂跟,不管是動態(tài)分布內(nèi)存,還是調(diào)用文件,鏈表都聽的一知半解浩聋,有的時候走神幾分鐘观蜗,就有點無法跟上進度臊恋,好在今天是C語言的最后一天衣洁,有充分的時間,對今天的內(nèi)容進行整理和回顧抖仅。