C語(yǔ)言超詳細(xì)講解指針與結(jié)構(gòu)體
本節(jié)目標(biāo)
理解內(nèi)存與地址的相關(guān)概念,初步掌握指針的定義與使用,理解結(jié)構(gòu)體的概念,掌握其基本的使用及訪問(wèn)方法。
初識(shí)指針
1、內(nèi)存與地址
內(nèi)存是電腦上特別重要的存儲(chǔ)器,計(jì)算機(jī)中程序的運(yùn)行都是在內(nèi)存中進(jìn)行的。
*所以為了有效的使用內(nèi)存,就把內(nèi)存劃分成一個(gè)個(gè)小的內(nèi)存單元,每個(gè)內(nèi)存單元的大小是1個(gè)字節(jié)。 *同時(shí)為了能夠有效的訪問(wèn)到內(nèi)存的每個(gè)單元,就給內(nèi)存單元進(jìn)行了編號(hào),這些編號(hào)被稱(chēng)為該內(nèi)存單元的地址。
2、變量的地址
變量是創(chuàng)建內(nèi)存中的(在內(nèi)存中分配空間的),每個(gè)內(nèi)存單元都有地址,所以變量也是有地址的。
取出變量地址如下:
#include <stdio.h> int main() { int num = 10; #//取出num的地址 //注:這里num的4個(gè)字節(jié),每個(gè)字節(jié)都有地址,取出的是第一個(gè)字節(jié)的地址(較小的地址) printf("%p\n", &num);//打印地址,%p是以地址的形式打印 return 0; }
3、指針變量
*指針變量:用來(lái)存放指針的變量(指針就是地址)。
#include<stdio.h> { int num = 10; int *p;//p為一個(gè)整形指針變量,int*是p的類(lèi)型,其中*代表p是一個(gè)指針,int表示p指向的變量的類(lèi)型是int的。 p = # return 0; }
4、指針的使用
#include <stdio.h> int main() { int num = 10; int* p = # *p = 20; printf("%d\n", num); return 0; }
int* p = &num :定義一個(gè)指針變量 p,并將 num 的地址賦給 p,這時(shí) p 里面存放的就是 num 的地址,也就是說(shuō) p 指向了 num;
*p = 20 :* 是解引用操作符,*p 就是對(duì) p 進(jìn)行解引用,就是通過(guò) p 里面存放的 num 的地址找到 num,并將 num 空間中存放的數(shù)據(jù)10修改為20;
5、指針變量的大小
#include <stdio.h> int main() { //%zu:用來(lái)打印無(wú)符號(hào)整型,與 %u 相似 printf("%zu\n", sizeof(char*)); printf("%zu\n", sizeof(short*)); printf("%zu\n", sizeof(int*)); printf("%zu\n", sizeof(double*)); return 0; }
*所以:指針大小在32位平臺(tái)是4個(gè)字節(jié),64位平臺(tái)是8個(gè)字節(jié)。(本質(zhì)是因?yàn)椴煌脚_(tái)下的地址線數(shù)量不同)
初識(shí)結(jié)構(gòu)體
1、什么是結(jié)構(gòu)體
結(jié)構(gòu)體是C語(yǔ)言中一種重要的數(shù)據(jù)類(lèi)型,該數(shù)據(jù)類(lèi)型由一組稱(chēng)為成員(或稱(chēng)為域,或稱(chēng)為元素)的不同數(shù)據(jù)組成,其中每個(gè)成員可以具有不同的類(lèi)型。結(jié)構(gòu)體通常用來(lái)表示類(lèi)型不同但是又相關(guān)的若干數(shù)據(jù)。
結(jié)構(gòu)體類(lèi)型不是由系統(tǒng)定義好的,而是需要程序設(shè)計(jì)者自己定義的。C語(yǔ)言提供了關(guān)鍵字struct來(lái)標(biāo)識(shí)所定義的結(jié)構(gòu)體類(lèi)型。
關(guān)鍵字struct和結(jié)構(gòu)體名組合成一種類(lèi)型標(biāo)識(shí)符,其地位如同通常的int、char等類(lèi)型標(biāo)識(shí)符,其用途就像 int 類(lèi)型標(biāo)識(shí)符標(biāo)識(shí)整型變量一樣可以用來(lái)定義結(jié)構(gòu)體變量。定義變量以后,該變量就可以像定義的其他變量一樣使用了;成員又稱(chēng)為成員變量,它是結(jié)構(gòu)體所包含的若干個(gè)基本的結(jié)構(gòu)類(lèi)型,必須用“{}”括起來(lái),并且要以分號(hào)結(jié)束,每個(gè)成員應(yīng)表明具體的數(shù)據(jù)類(lèi)型。
2、結(jié)構(gòu)體的定義
下面我們以學(xué)生來(lái)舉例:假設(shè)一個(gè)學(xué)生包括姓名、年齡、性別、學(xué)號(hào)五個(gè)信息,為了能夠整體的描述一個(gè)學(xué)生,我們可以定義一個(gè)結(jié)構(gòu)體類(lèi)型。
struct Stu { char name[20];//名字 int age; //年齡 char sex[5]; //性別 char id[15]; //學(xué)號(hào) };
3、結(jié)構(gòu)體的使用
#include<stdio.h> int main() { //定義結(jié)構(gòu)體變量并對(duì)其進(jìn)行初始化 struct Stu s = { "張三",18,"nan","220210101" }; //兩種結(jié)構(gòu)體訪問(wèn)操作符 // . 操作符 printf("%s\t%d\t%s\t%s\n", s.name, s.age, s.sex, s.id); // -> 操作符 struct Stu* ps = &s; //定義結(jié)構(gòu)體指針變量 ps 并將 s 的地址賦給 ps printf("%s\t%d\t%s\t%s\n", ps->name, ps->age, ps->sex, ps->id); return 0; }
注意:-> 操作符只能在已經(jīng)有結(jié)構(gòu)體指針的情況下才能使用。
到此這篇關(guān)于C語(yǔ)言超詳細(xì)講解指針與結(jié)構(gòu)體的文章就介紹到這了,更多相關(guān)C語(yǔ)言指針與結(jié)構(gòu)體內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
減少C++代碼編譯時(shí)間的簡(jiǎn)單方法(必看篇)
下面小編就為大家?guī)?lái)一篇減少C++代碼編譯時(shí)間的簡(jiǎn)單方法(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01C語(yǔ)言實(shí)現(xiàn)打印數(shù)字金字塔
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)打印數(shù)字金字塔方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11C語(yǔ)言模擬實(shí)現(xiàn)memmove的示例代碼
memmove函數(shù)用于拷貝字節(jié),如果目標(biāo)區(qū)域和源區(qū)域有重疊的話,memmove能夠保證源串在被覆蓋之前將重疊區(qū)域的字節(jié)拷貝到目標(biāo)區(qū)域中,但復(fù)制后源內(nèi)容會(huì)被更改。本文主要介紹了C語(yǔ)言模擬實(shí)現(xiàn)memmove的示例代碼,需要的可以參考一下2022-12-12C++與Java分別解決活動(dòng)選擇問(wèn)題和帶權(quán)活動(dòng)選擇問(wèn)題
這篇文章介紹了C++與Java分別解決活動(dòng)選擇問(wèn)題和帶權(quán)活動(dòng)選擇問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06Opencv實(shí)現(xiàn)視頻播放與進(jìn)度控制
這篇文章主要為大家詳細(xì)介紹了Opencv實(shí)現(xiàn)視頻播放與進(jìn)度控制,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01