真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

c語(yǔ)言函數(shù)庫(kù)教程 c語(yǔ)言庫(kù)函數(shù)的使用方法

如何學(xué)習(xí)C語(yǔ)言的庫(kù)函數(shù)?

1. 最好是先看看標(biāo)準(zhǔn)文檔,在cppreference.com這網(wǎng)站也能查看,打開(kāi)文檔里面有各標(biāo)準(zhǔn)庫(kù)函數(shù)、宏的列表以及詳細(xì)介紹,C和C++的都有,如英文讀不懂的話(huà)可以選擇中文版。內(nèi)置的系列函數(shù),查找文檔就一目了然,還有非常詳盡的參數(shù)、功能、返回值等說(shuō)明以及各種格式化說(shuō)明符的用法。

齊河網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,齊河網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為齊河上千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的齊河做網(wǎng)站的公司定做!

2. 對(duì)于初學(xué)C語(yǔ)言底層實(shí)現(xiàn)并不需要深入了解,如想了解的話(huà)可以研究一下glibc之類(lèi)的實(shí)現(xiàn)。

c語(yǔ)言中的庫(kù)函數(shù)是如何使用的,最好有例子

其實(shí)在C語(yǔ)言編程中,我們所用的在部分函數(shù)就是C語(yǔ)言庫(kù)本身帶的函數(shù),在使用某一個(gè)庫(kù)文件之前,我們先要包含庫(kù)文件所對(duì)應(yīng)的頭文件,再在我們需要的地方調(diào)用庫(kù)函數(shù)就行了.最常用的printf();這就是一個(gè)庫(kù)函數(shù),這個(gè)庫(kù)函數(shù)在頭文件stdio.h中聲明.所以使用前要先#include stdio.h

舉個(gè)例子:

#include stdio.h //一定要先包含庫(kù)函數(shù)聲明的文件

int main()

{

printf("for example!\n"); //在此處調(diào)用庫(kù)函數(shù)

}

如果想要了解更多的庫(kù)函數(shù),可以參考C語(yǔ)言的教材,一般的附錄中會(huì)列出.也可以查看C庫(kù)函數(shù).

求C語(yǔ)言的常用函數(shù),詳細(xì)一點(diǎn)

C語(yǔ)言的常用庫(kù)函數(shù)

函數(shù)1。absread()讀磁盤(pán)絕對(duì)扇區(qū)函數(shù)

函數(shù)2。abswrite()寫(xiě)磁盤(pán)絕對(duì)扇區(qū)函數(shù)

函數(shù)3。atof()將字符串轉(zhuǎn)換成浮點(diǎn)數(shù)的函數(shù)

函數(shù)4。atoi()將字符串轉(zhuǎn)換成整型數(shù)的函數(shù)

函數(shù)5。atol()將字符串轉(zhuǎn)換成長(zhǎng)整型數(shù)的函數(shù)

函數(shù)6。bcd()把一個(gè)數(shù)轉(zhuǎn)換成對(duì)應(yīng)的BCD碼的函數(shù)

函數(shù)7。bdos()

函數(shù)8。biosdisk()調(diào)用BIOS磁盤(pán)驅(qū)動(dòng)程序函數(shù)

函數(shù)9。biosprint()調(diào)用BIOS打印機(jī)I/O接口的函數(shù)

函數(shù)10。calloc()分配內(nèi)存函數(shù)

函數(shù)11。ceil()

函數(shù)12。cgets()讀字符串函數(shù)

函數(shù)13。chdir()改變當(dāng)前目錄的函數(shù)

函數(shù)14。_chmod()改變文件存取權(quán)限的函數(shù)

函數(shù)15。chmod()改變文件存取權(quán)限的函數(shù)

函數(shù)16。clock()

函數(shù)17。close()關(guān)閉文件函數(shù)

函數(shù)18。closegraph()關(guān)閉圖形函數(shù)

函數(shù)19。cos()

函數(shù)20。ctrlbrk()設(shè)置ctrl-break處理程序的函數(shù)

函數(shù)21。delay()暫停函數(shù)

函數(shù)22。disable()屏蔽中斷的宏

函數(shù)23。enable()開(kāi)硬件中斷的宏

函數(shù)24。exec()加載并運(yùn)行其它程序的函數(shù)族

函數(shù)25。farcalloc()從遠(yuǎn)堆中分配內(nèi)存的函數(shù)

函數(shù)26。farfree()從遠(yuǎn)堆中釋放一塊已分配內(nèi)存的函數(shù)

函數(shù)27。farmalloc()從遠(yuǎn)堆中分配內(nèi)存的函數(shù)

函數(shù)28。farrealloc()調(diào)整遠(yuǎn)堆中已分配塊的函數(shù)

函數(shù)29。fclose()關(guān)閉一個(gè)流函數(shù)

函數(shù)30。fcloseall()關(guān)閉打開(kāi)的流的函數(shù)

函數(shù)31。feof()檢查文件是否結(jié)束的函數(shù)

函數(shù)32。fgets()從流中讀取一字符串的函數(shù)

函數(shù)33。findfirst()函數(shù)和findnext()函數(shù)

函數(shù)34。floodfill()填充區(qū)域的函數(shù)

函數(shù)35。floor()

函數(shù)36。fnmerge()建立文件路徑函數(shù)

函數(shù)37。fnsplit()分解完整的路徑名函數(shù)

函數(shù)38。fopen()打開(kāi)一個(gè)流函數(shù)

函數(shù)39。FP_OFF()獲取遠(yuǎn)地址偏移量的宏

函數(shù)40。fprintf()傳送輸出到一個(gè)流中的函數(shù)

函數(shù)41。FP_SEG()獲取遠(yuǎn)地址段值的宏

函數(shù)42。fscanf()格式化輸入函數(shù)

函數(shù)43。fseek()移動(dòng)文件指針函數(shù)

函數(shù)44。fwrite()把參數(shù)寫(xiě)入流中的函數(shù)

函數(shù)45。gcvt()把雙精度數(shù)轉(zhuǎn)化成字符串的函數(shù)

函數(shù)46。geninterrupt()執(zhí)行中斷函數(shù)

函數(shù)47。getc()從流中取字符的宏

函數(shù)48。getch()從鍵盤(pán)無(wú)回顯地讀取一字符的函數(shù)

函數(shù)49。getchar()從stdin流中讀取一個(gè)字符的函數(shù)

函數(shù)50。getcurdir()讀取指定驅(qū)動(dòng)器的當(dāng)前目錄的函數(shù)

函數(shù)61。getcwd()讀取當(dāng)前目錄的函數(shù)

函數(shù)62。getdate()讀取系統(tǒng)日期函數(shù)

函數(shù)63。getdfree()讀取磁盤(pán)空閑空間的函數(shù)

函數(shù)64。getdisk()讀取當(dāng)前磁盤(pán)驅(qū)動(dòng)器號(hào)函數(shù)

函數(shù)65。getenv()讀取環(huán)境變量的當(dāng)前值的函數(shù)

函數(shù)66。getimage()將指定區(qū)域的位圖象存入內(nèi)存的函數(shù)

函數(shù)67。getmaxx()返回屏幕上最大的X坐標(biāo)值的函數(shù)

函數(shù)68。getmaxy()返回屏幕上最大的Y坐標(biāo)值的函數(shù)

函數(shù)69。getpixel()讀取像素顏色的函數(shù)

函數(shù)70。getpsp()

函數(shù)71。gets()從標(biāo)準(zhǔn)輸入流stdio中讀取一字符串的函數(shù)

函數(shù)72。gettime()讀取系統(tǒng)時(shí)間的函數(shù)

函數(shù)73。getvect()讀取中斷向量函數(shù)

函數(shù)74。getx()返回當(dāng)前圖形方式下位置的X坐標(biāo)值的函數(shù)

函數(shù)75。gety()返回當(dāng)前圖形方式下位置的Y坐標(biāo)值的函數(shù)

函數(shù)76。imagesize()返回保存圖像緩沖區(qū)大小的函數(shù)

函數(shù)77。initgraph()顯示模式控制函數(shù)(初始化圖形系統(tǒng)函數(shù))

函數(shù)78。inport()從端口中讀入一個(gè)字的函數(shù)

函數(shù)79。inportb()從端口讀入一個(gè)字節(jié)的函數(shù)

函數(shù)80。int86()執(zhí)行中斷函數(shù)(調(diào)用8086軟中斷函數(shù))

函數(shù)81。int86x()執(zhí)行中斷函數(shù) (通用8086軟中斷接口函數(shù))

函數(shù)82。intdos()通用dos中斷接口函數(shù)

函數(shù)83。intdosx()通用dos中斷接口函數(shù)

函數(shù)84。intr()執(zhí)行8086軟中斷函數(shù)(改變軟中斷接口函數(shù))

函數(shù)85。itoa()把整形數(shù)轉(zhuǎn)換為字符串的函數(shù)

函數(shù)86。kbhit()檢查當(dāng)前按下的鍵的函數(shù)

函數(shù)87。keep()駐留并退出函數(shù)

函數(shù)88。log()

函數(shù)89。log10()

函數(shù)90。_lrotl()將一個(gè)無(wú)符號(hào)長(zhǎng)整形數(shù)左循環(huán)移位的函數(shù)

函數(shù)91。_lrotr()將一個(gè)無(wú)符號(hào)長(zhǎng)整形數(shù)右循環(huán)移位的函數(shù)

函數(shù)92。lseek()移動(dòng)文件指針函數(shù)

函數(shù)93。ltoa()把長(zhǎng)整形數(shù)轉(zhuǎn)換為字符串的函數(shù)

函數(shù)94。malloc()分配內(nèi)存函數(shù)

函數(shù)95。mkdir()創(chuàng)建目錄函數(shù)

函數(shù)96。mktemp()建立一個(gè)唯一的文件名的函數(shù)

函數(shù)97。MK_FP()設(shè)置一個(gè)遠(yuǎn)指針的宏

函數(shù)98。movedata()拷貝數(shù)據(jù)函數(shù)

函數(shù)99。_open()打開(kāi)一個(gè)文件進(jìn)行讀寫(xiě)的函數(shù)

函數(shù)100。open()打開(kāi)文件進(jìn)行讀寫(xiě)的函數(shù)

函數(shù)101。outport()輸出一個(gè)字到端口中的函數(shù)

函數(shù)102。outportb()輸出一個(gè)字節(jié)到端口中的函數(shù)

函數(shù)103。outtextxy()在指定位置顯示一字符串的函數(shù)

函數(shù)104。peek()返回指定內(nèi)存中字的函數(shù)

函數(shù)105。peekb()返回指定內(nèi)存中字節(jié)的函數(shù)

函數(shù)106。poke()在指定的內(nèi)存中存儲(chǔ)一個(gè)字的函數(shù)

函數(shù)107。pokeb()在指定的內(nèi)存中存儲(chǔ)一個(gè)字節(jié)的函數(shù)

函數(shù)108。pow()

函數(shù)109。printf()寫(xiě)格式化輸出到stdout的函數(shù)

函數(shù)110。putch()向屏幕輸出字符的函數(shù)

函數(shù)111。putchar()在stdout上輸出字符的宏

函數(shù)112。putenv()將字符串放入當(dāng)前環(huán)境中的函數(shù)

函數(shù)113。putimage()重新寫(xiě)屏函數(shù)(輸出一個(gè)位圖象到圖形屏幕上的函數(shù))

函數(shù)114。putpixel()寫(xiě)像素點(diǎn)函數(shù)

函數(shù)115。puts()輸出一字符串到stdout(標(biāo)準(zhǔn)輸出)的函數(shù)

函數(shù)116。_read()讀文件函數(shù)

函數(shù)117。read()讀文件函數(shù)

函數(shù)118。realloc()重新分配內(nèi)存函數(shù)

函數(shù)119。rectangle()畫(huà)一個(gè)矩形的函數(shù)

函數(shù)120。remove()刪除一個(gè)文件的函數(shù)

函數(shù)121。rename()文件改名函數(shù)

函數(shù)122。restorecrtmode()恢復(fù)屏幕視頻模式為調(diào)用initgraph前的設(shè)置的函數(shù)

函數(shù)123。rmdir()刪除目錄函數(shù)

函數(shù)124。_rotl()將一個(gè)無(wú)符號(hào)整形數(shù)左循環(huán)移位的函數(shù)

函數(shù)125。_rotr()將一個(gè)無(wú)符號(hào)整形數(shù)右循環(huán)移位的函數(shù)

函數(shù)126。scanf()格式化輸入函數(shù)

函數(shù)127。searchpath()按dos路徑查找一個(gè)文件的函數(shù)

函數(shù)128。segread()讀段寄存器函數(shù)

函數(shù)129。setactivepage()設(shè)置圖形輸出活動(dòng)頁(yè)的函數(shù)

函數(shù)130。setcolor()設(shè)置當(dāng)前要畫(huà)的線(xiàn)顏色的函數(shù)

函數(shù)131。setdisk()設(shè)置當(dāng)前驅(qū)動(dòng)器的函數(shù)

函數(shù)132。setgraphmode()將系統(tǒng)設(shè)置成圖形模式并清屏的函數(shù)

函數(shù)133。setlinestyle()設(shè)置當(dāng)前畫(huà)線(xiàn)寬度和類(lèi)型的函數(shù)

函數(shù)134。settextstyle()顯示字符的當(dāng)前設(shè)置函數(shù)

函數(shù)135。setvect()設(shè)置中斷向量函數(shù)

函數(shù)136。setviewport()建立視口的函數(shù)

函數(shù)137。setvisualpage()設(shè)置可見(jiàn)的圖形頁(yè)號(hào)的函數(shù)

函數(shù)138。sin()

函數(shù)139。sprintf()格式化輸出到數(shù)組的函數(shù)

函數(shù)140。strcat()

函數(shù)141。tan()

函數(shù)142。_write()寫(xiě)文件函數(shù)

函數(shù)143。write()寫(xiě)文件函數(shù)

原文釋義請(qǐng)到百度文庫(kù)里搜尋字串“C語(yǔ)言常用函數(shù)”后下載

函數(shù)51-60因原注里排序號(hào)碼少編,所以只有133個(gè)常用函數(shù)。

DOC大小是119.5KB

貢獻(xiàn)時(shí)間:2010-09-10

貢獻(xiàn)者:handanlinzhang

C語(yǔ)言庫(kù)函數(shù)如何編寫(xiě)?

/***

*printf.c - print formatted

*

* Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.

*

*Purpose:

* defines printf() - print formatted data

*

*******************************************************************************/

#include

#include

#include

#include

#include

#include

#include

/***

*int printf(format, ...) - print formatted data

*

*Purpose:

* Prints formatted data on stdout using the format string to

* format data and getting as many arguments as called for

* Uses temporary buffering to improve efficiency.

* _output does the real work here

*

*Entry:

* char *format - format string to control data format/number of arguments

* followed by list of arguments, number and type controlled by

* format string

*

*Exit:

* returns number of characters printed

*

*Exceptions:

*

*******************************************************************************/

int __cdecl printf (

const char *format,

...

)

/*

* stdout ''PRINT'', ''F''ormatted

*/

{

va_list arglist;

int buffing;

int retval;

va_start(arglist, format);

_ASSERTE(format != NULL);//斷言宏。如果輸出格式字符串指針為空,則在DEBUG版下斷言,報(bào)告錯(cuò)誤。

_lock_str2(1, stdout);

buffing = _stbuf(stdout);//stdout:指定輸出到屏幕

retval = _output(stdout,format,arglist);

_ftbuf(buffing, stdout);

_unlock_str2(1, stdout);

return(retval);

}

以上為printf()的源代碼

1、從含有可選參數(shù)函數(shù)中獲得可選參數(shù),以及操作這些參數(shù)

typedef char *va_list;

void va_start( va_list arg_ptr, prev_param );

type va_arg( va_list arg_ptr, type );

void va_end( va_list arg_ptr );

假定函數(shù)含有一個(gè)必選參數(shù)和多個(gè)可選參數(shù),必選參數(shù)聲明為普通數(shù)據(jù)類(lèi)型,且能通過(guò)參數(shù)名來(lái)獲得該變量的值??蛇x參數(shù)通過(guò)宏va_start、va_arg和va_end(定義在stdarg.h或varargs.h中)來(lái)進(jìn)行操作,即通過(guò)設(shè)置指向第一個(gè)可選參數(shù)指針、返回當(dāng)前參數(shù)、在返回參數(shù)后重新設(shè)置指針來(lái)操作所有的可選參數(shù)。

va_start:為獲取可變數(shù)目參數(shù)的函數(shù)的參數(shù)提供一種便捷手段。設(shè)置arg_ptr為指向傳給函數(shù)參數(shù)列表中的第一個(gè)可選參數(shù)的指針,且該參數(shù)必須是va_list類(lèi)型。prev_param是在參數(shù)列表中第一個(gè)可選參數(shù)前的必選參數(shù)。

va_arg:返回由arg_ptr所指向的參數(shù)的值,且自增指向下一個(gè)參數(shù)的地址。type為當(dāng)前參數(shù)的類(lèi)型,用來(lái)計(jì)算該參數(shù)的長(zhǎng)度,確定下一個(gè)參數(shù)的起始位置。它可以在函數(shù)中應(yīng)用多次,直到得到函數(shù)的所有參數(shù)為止,但必須在宏va_start后面調(diào)用。

va_end:在獲取所有的參數(shù)后,設(shè)置指針arg_ptr為NULL。

下面舉例說(shuō)明:

#include

#include

int average( int first, ... );

void main( void )

{

/* Call with 3 integers (-1 is used as terminator). */

printf( "Average is: %d\n", average( 2, 3, 4, -1 ) );

/* Call with 4 integers. */

printf( "Average is: %d\n", average( 5, 7, 9, 11, -1 ) );

/* Call with just -1 terminator. */

printf( "Average is: %d\n", average( -1 ) );

}

int average( int first, ... )

{

int count = 0, sum = 0, i = first;

va_list marker;

va_start( marker, first ); /* Initialize variable arguments. */

while( i != -1 )

{

sum += i;

count++;

i = va_arg( marker, int);

}

va_end( marker ); /* Reset variable arguments. */

return( sum ? (sum / count) : 0 );

}

返回值為:

Average is: 3

Average is: 8

Average is: 0

綜上所述,在printf()函數(shù)中,可以只輸出一個(gè)字符串,也可按照一定的形式輸出含有多個(gè)可選參數(shù)的字符串信息。因此,首先就要通過(guò)這些宏來(lái)獲取所有的可選參數(shù)。在上面的源碼可以看出printf()中,只使用了宏at_start,將可選參數(shù)的首地址賦給了arglist。

2、鎖定字符串及輸出字符串到屏幕

#define _lock_str2(i,s) _lock_file2(i,s)

void __cdecl _lock_file2(int, void *);

#define _unlock_str2(i,s) _unlock_file2(i,s)

void __cdecl _unlock_file2(int, void *);

int __cdecl _stbuf(FILE *);

void __cdecl _ftbuf(int, FILE *);

int __cdecl _output(FILE *, const char *, va_list);

在output函數(shù)中,讀取格式字符串中的每一個(gè)字符,然后對(duì)其進(jìn)行處理,處理方式根據(jù)每一個(gè)字符所代表的意義來(lái)進(jìn)行,如:普通字符直接利用函數(shù)WRITE_CHAR(ch, charsout);輸出到控制臺(tái)。

其中的主要部分是對(duì)轉(zhuǎn)換說(shuō)明符(d,c,s,f)的處理,現(xiàn)在將對(duì)其中的部分代碼進(jìn)行詳細(xì)說(shuō)明,這里只說(shuō)明最基本的轉(zhuǎn)換說(shuō)明符,對(duì)這些須基本的轉(zhuǎn)換說(shuō)明符進(jìn)行修飾的修飾符,程序中單獨(dú)進(jìn)行處理。下面是函數(shù)output()(output.c)部分源代碼:

case ST_TYPE:

//表示當(dāng)前處理的字符的類(lèi)型為轉(zhuǎn)換說(shuō)明符。

...

switch (ch) {

//下面對(duì)參數(shù)的獲取都是利用宏va_arg( va_list arg_ptr, type );來(lái)進(jìn)行的。

case ''c'': {

//從參數(shù)表中獲取單個(gè)字符,輸出到緩沖字符串中,此時(shí),type=int

buffer[0] = (char) get_int_arg(argptr); /* get char to print */

text = buffer;

textlen = 1; /* print just a single character */

}

break;

case ''s'': {

//從參數(shù)表中獲取字符串,輸出到緩沖字符串中,此時(shí),type=char*

int i;

char *p; /* temps */

text = get_ptr_arg(argptr);

...

}

break;

case ''w'': {

//對(duì)寬字符進(jìn)行處理

...

} /* case ''w'' */

break;

...

case ''e'':

case ''f'':

case ''g'': {

//對(duì)浮點(diǎn)數(shù)進(jìn)行操作

...

#if !LONGDOUBLE_IS_DOUBLE

/* do the conversion */

if (flags FL_LONGDOUBLE) {

_cldcvt((LONGDOUBLE*)argptr, text, ch, precision, capexp);

va_arg(argptr, LONGDOUBLE);

//對(duì)長(zhǎng)雙精度型進(jìn)行處理,此時(shí),type=long double

}

else

#endif /* !LONGDOUBLE_IS_DOUBLE */

{

//對(duì)雙精度型進(jìn)行處理,此時(shí),type=double

_cfltcvt((DOUBLE*)argptr, text, ch, precision, capexp);

va_arg(argptr, DOUBLE);

}

...

break;

//對(duì)整型變量處理

case ''d'':

case ''i'':

...

goto COMMON_INT;

case ''u'':

radix = 10;

goto COMMON_INT;

case ''p'':

...

goto COMMON_INT;

case ''o'':

...

注:對(duì)于浮點(diǎn)型double和long double,有相應(yīng)的轉(zhuǎn)換說(shuō)明符(%f表示雙精度型,%lf表示長(zhǎng)雙精度型),而float卻沒(méi)有。其中的原因是,在KRC下,float值用于表達(dá)式或用作參數(shù)前,會(huì)自動(dòng)轉(zhuǎn)換成double類(lèi)型。而ANSI C一般不會(huì)自動(dòng)把float轉(zhuǎn)換成double。有些程序已假定其中的float參數(shù)會(huì)被轉(zhuǎn)換成double,為了保護(hù)大量這樣的程序,所有printf()函數(shù)的float參數(shù)還是被自動(dòng)轉(zhuǎn)換成double型。因此,在KRC或ANSI C下,都無(wú)需用特定的轉(zhuǎn)換說(shuō)明符來(lái)顯示float型。

綜上所述,轉(zhuǎn)換說(shuō)明符必須與待打印字符的類(lèi)型。通常,用戶(hù)有種選擇。例如,如要打印一個(gè)int類(lèi)型的值。則只可以使用%d,%x或%o。所有這些說(shuō)明符都表示要打印一個(gè)int類(lèi)型的值;它們只不過(guò)提供了一個(gè)數(shù)值的幾種不同表示。類(lèi)似一,可以用%f、%g和%e來(lái)表示double類(lèi)型的值。但如果轉(zhuǎn)換說(shuō)明與類(lèi)型不匹配,將會(huì)出現(xiàn)意想不到的結(jié)果。為什么呢?問(wèn)題就在于C向函數(shù)傳遞信息的方式。

這個(gè)失敗的根本細(xì)節(jié)與具體實(shí)現(xiàn)相關(guān)。它決定了系統(tǒng)中的參數(shù)以何方式傳遞。函數(shù)調(diào)用如下:

float n1;

double n2;

long n3;

long n4;

...

printf("%ld,%ld,%ld,%ld",n1,n2,n3,n4);

這個(gè)調(diào)用告訴計(jì)算機(jī),要把變量n1,n2,n3和n4的值交給計(jì)算機(jī),它把這些變量放進(jìn)稱(chēng)作棧(stack)的內(nèi)存區(qū)域中,來(lái)完成這一任務(wù)。計(jì)算機(jī)把這些值放進(jìn)棧中,其根據(jù)是變量的類(lèi)型而不是轉(zhuǎn)換說(shuō)明符,比如n1,把8個(gè)字節(jié)放入棧中(float被轉(zhuǎn)換成double),類(lèi)似地,為n2放了8字節(jié),其后給n3和n4各放了4個(gè)字節(jié)。接著,控制的對(duì)象轉(zhuǎn)移到printf();此函數(shù)從棧中讀數(shù),不過(guò)在這一過(guò)程中,它是在轉(zhuǎn)換說(shuō)明符的指導(dǎo)下,讀取數(shù)值的。說(shuō)明符%ld指定printf()應(yīng)讀4個(gè)字節(jié)(va_arg( va_list arg_ptr, type )中type=long),因此printf()讀入棧中的4個(gè)字節(jié),作為它的第一個(gè)值。但是這只是n1的前半部分,這個(gè)值被看成一個(gè)long整數(shù)。下一個(gè)說(shuō)明符%ld讀入4個(gè)字節(jié),這正是n1的后半部分,這個(gè)值被看成第二個(gè)long整數(shù)。類(lèi)似地,第三、第四次又讀入n2的前后兩部分。因此,盡管我們對(duì)n3和n4使用了正確的說(shuō)明符,printf()仍然會(huì)產(chǎn)生錯(cuò)誤。

求C語(yǔ)言教程

我給你電子文檔筆記吧~~

復(fù)制來(lái)的....

第一章 概述

1. C語(yǔ)言的特點(diǎn)

①語(yǔ)言簡(jiǎn)潔、緊湊,使用方便、靈活。共有32個(gè)關(guān)鍵字,9種控制語(yǔ)句。

②運(yùn)算符豐富,公有34種運(yùn)算符。

③數(shù)據(jù)結(jié)構(gòu)豐富,數(shù)據(jù)類(lèi)型有:整型、實(shí)型、字符型、數(shù)組、指針、結(jié)構(gòu)體、共用體等。

④具有結(jié)構(gòu)化的控制語(yǔ)句(如if…else、while、do…while、switch、for)

⑤語(yǔ)法限制不太嚴(yán)格,程序設(shè)計(jì)自由度大。

⑥允許直接訪(fǎng)問(wèn)物理地址,能進(jìn)行位(bit)操作,可以直接對(duì)硬件操作。

⑦生成目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高。

⑧可移植性好。

2. C語(yǔ)言的用途

C雖不擅長(zhǎng)科學(xué)計(jì)算和管理領(lǐng)域,但對(duì)操作系統(tǒng)和系統(tǒng)實(shí)用程序以及對(duì)硬件進(jìn)行操作方面,C有明顯的優(yōu)勢(shì)?,F(xiàn)在很多大型應(yīng)用軟件也用C編寫(xiě)。

Top of Page

第二章 數(shù)據(jù)類(lèi)型、運(yùn)算符與表達(dá)式

1. C的數(shù)據(jù)類(lèi)型

C的數(shù)據(jù)類(lèi)型包括:整型、字符型、實(shí)型或浮點(diǎn)型(單精度和雙精度)、枚舉類(lèi)型、數(shù)組類(lèi)型、結(jié)構(gòu)體類(lèi)型、共用體類(lèi)型、指針類(lèi)型和空類(lèi)型。

2. 常量與變量

常量其值不可改變,符號(hào)常量名通常用大寫(xiě)。變量其值可以改變,變量名只能由字母、數(shù)字和下劃線(xiàn)組成,且第一個(gè)字符必須為字母或下劃線(xiàn)。否則為不合法的變量名。變量在編譯時(shí)為其分配相應(yīng)存儲(chǔ)單元。

3. 整型數(shù)據(jù)

整型常量的表示方法:十進(jìn)制不用說(shuō)了,八進(jìn)制以0開(kāi)頭,如0123,十六進(jìn)制以0x開(kāi)頭,如0x1e。

整型變量分為:基本型(int)、短整型(short int)、長(zhǎng)整型(long int)和無(wú)符號(hào)型。不同機(jī)器上各類(lèi)數(shù)據(jù)所占內(nèi)存字節(jié)數(shù)不同,一般int型為2個(gè)字節(jié),long型為4個(gè)字節(jié)。

4. 實(shí)型數(shù)據(jù)

實(shí)型常量表示形式:十進(jìn)制形式由數(shù)字和小數(shù)點(diǎn)組成(必須有小數(shù)點(diǎn)),如:0.12、.123、123

0.0等。指數(shù)形式如123e3代表123×10的三次方。

實(shí)型變量分為單精度(float)和雙精度(double)兩類(lèi)。在一般系統(tǒng)中float型占4字節(jié),7位有效數(shù)字,double型占8字節(jié),15~16位有效數(shù)字。

5. 字符型數(shù)據(jù)

字符變量用單引號(hào)括起來(lái),如'a','b'等。還有一些是特殊的字符常量,如'\n','\t'等。分別代表?yè)Q行和橫向跳格。

字符變量以char 來(lái)定義,一個(gè)變量只能存放一個(gè)字符常量。

字符串常量是由雙引號(hào)括起來(lái)的字符序列。這里一定要注意'a'和"a"的不同,前者為字符常量,后者為字符串常量,c規(guī)定:每個(gè)字符串的結(jié)尾加一個(gè)結(jié)束標(biāo)志'',實(shí)際上"a"包含兩個(gè)字符:'a'和''。

6. 數(shù)值型數(shù)據(jù)間的混合運(yùn)算

整型、字符型、實(shí)型數(shù)據(jù)間可以混合運(yùn)算,運(yùn)算時(shí)不同類(lèi)型數(shù)據(jù)要轉(zhuǎn)換成同一類(lèi)型再運(yùn)算,轉(zhuǎn)換規(guī)則:

char,short - int - unsigned - long - double - float

7. 運(yùn)算符和表達(dá)式

c運(yùn)算符包括:

算數(shù)運(yùn)算符( + - * / % )

關(guān)系運(yùn)算符( == = = != )

邏輯運(yùn)算符( ! || )

位運(yùn)算符( ~ | ^ )

賦值運(yùn)算符( = )

條件運(yùn)算符( ? : )

逗號(hào)運(yùn)算符( , )

指針運(yùn)算符( * )

求字節(jié)數(shù)( sizeof )

強(qiáng)制類(lèi)型轉(zhuǎn)換(類(lèi)型)

分量運(yùn)算符( . - )

下標(biāo)運(yùn)算符( [ ] )

其它運(yùn)算符( 如函數(shù)調(diào)用運(yùn)算符( ) )

自增自減運(yùn)算符( ++ -- )注意:++i和i++的不同之處,++i使用i之前先使i加1,i++使用i之后,使i加1。

逗號(hào)表達(dá)式的求解過(guò)程:先求解表達(dá)式1,再求解表達(dá)式2,整個(gè)表達(dá)式的值是表達(dá)式2的值。

Top of Page

第三章 最簡(jiǎn)單的c程序設(shè)計(jì)

1.c的9種控制語(yǔ)句:

if() ~ else~

for()~

while()~

do~while()

continue

break

switch

goto

return

程序的三種基本結(jié)構(gòu):順序結(jié)構(gòu),選擇結(jié)構(gòu),循環(huán)結(jié)構(gòu)

2.?dāng)?shù)據(jù)輸出

c語(yǔ)言不提供輸入輸出語(yǔ)句,輸入輸出操作是由c的庫(kù)函數(shù)完成。但要包含頭文件stdio.h。

putchar( ) 向終端輸出一個(gè)字符

printf( )的格式字符:

① d格式符 用來(lái)輸出十進(jìn)制整數(shù)

%d 按整型數(shù)據(jù)的實(shí)際長(zhǎng)度輸出

%md 使輸出長(zhǎng)度為m,如果數(shù)據(jù)長(zhǎng)度小于m,則左補(bǔ)空格,如果大于m,則輸出實(shí)際長(zhǎng)度

%ld 輸出長(zhǎng)整型數(shù)據(jù)

② o格式符 以八進(jìn)制形式輸出整數(shù)

③ x格式符 以十六進(jìn)制形式輸出整數(shù)

④ u格式符 用來(lái)輸出unsigned型數(shù)據(jù),以十進(jìn)制形式輸出

⑤ c格式符 用來(lái)輸出一個(gè)字符

⑥ s格式符 輸出一個(gè)字符串

%s 輸出實(shí)際長(zhǎng)度字符串

%ms 輸出的串占m列,如果串長(zhǎng)度小于m,左補(bǔ)空格,如果大于m,實(shí)際輸出

%-ms輸出的串占m列,如果串長(zhǎng)度小于m,右補(bǔ)空格,

%m.ns 輸出占m列,但只取字符串中左端n個(gè)字符并靠右對(duì)齊

%-m.ns m、n含義同上,靠左對(duì)齊,如果nm,則m自動(dòng)取n值

⑦ f格式符 以小數(shù)形式輸出實(shí)數(shù)

%f 整數(shù)部分全部輸出,小數(shù)部分輸出6位

%m.nf 輸出數(shù)據(jù)共占m列,其中有n位小數(shù)。如果數(shù)值長(zhǎng)度小于m,左補(bǔ)空格

%-m.nf 同上,右補(bǔ)空格

⑧ e格式符 以指數(shù)形式輸出實(shí)數(shù)

%e 系統(tǒng)指定6位小數(shù),5位指數(shù)(e+002 )

⑨ g格式符 輸出實(shí)數(shù),根據(jù)數(shù)值大小,自動(dòng)選f格式或e格式

3.?dāng)?shù)據(jù)輸入

getchar( ) 從終端輸入一個(gè)字符

scanf( 格式控制,地址列表) 標(biāo)準(zhǔn)C scanf中不使用%u,對(duì)于unsigned型數(shù)據(jù),以%d或%o或%x輸入。%后的*,用來(lái)跳過(guò)它相應(yīng)的數(shù)據(jù)。輸入數(shù)據(jù)時(shí)不能規(guī)定精度如scanf( "%7.2f", a );是不合法的。

Top of Page

第四章 邏輯運(yùn)算和判斷選取控制

1. 關(guān)系運(yùn)算符:

c提供6種關(guān)系運(yùn)算符( = = == != )前四種優(yōu)先級(jí)高于后兩種。

2. If語(yǔ)句

C提供了三種形式的if語(yǔ)句

If(表達(dá)式) 語(yǔ)句

If(表達(dá)式) 語(yǔ)句1 else 語(yǔ)句2

If(表達(dá)式1) 語(yǔ)句1

Else if(表達(dá)式2) 語(yǔ)句2

else 語(yǔ)句n

3. 條件運(yùn)算符

(ab)?a:b 條件為真,表達(dá)式取值a,否則取值b

4. Switch語(yǔ)句

Switch(表達(dá)式)

{

case 常量表達(dá)式1:語(yǔ)句1; break;

case 常量表達(dá)式2:語(yǔ)句2; break;

case 常量表達(dá)式n:語(yǔ)句n; break;

default :語(yǔ)句n+1;

}

Top of Page

第五章 循環(huán)控制

1. 幾種循環(huán)語(yǔ)句

goto語(yǔ)句(現(xiàn)已很少使用)

while語(yǔ)句 先判斷表達(dá)式后執(zhí)行語(yǔ)句

do-while語(yǔ)句 先執(zhí)行語(yǔ)句后判斷表達(dá)式

for語(yǔ)句

2. Break語(yǔ)句和continue語(yǔ)句

Break語(yǔ)句用于跳出循環(huán),continue用于結(jié)束本次循環(huán)。

Top of Page

第六章 數(shù)組

1. 一維數(shù)組

c規(guī)定只有靜態(tài)存儲(chǔ)(static)和外部存儲(chǔ)(extern)數(shù)組才能初始化。給數(shù)組初始化時(shí)可以不指定數(shù)組長(zhǎng)度。

2. 二維數(shù)組

3. 字符數(shù)組

部分字符串處理函數(shù)

puts(字符數(shù)組) 將一個(gè)字符串輸出到終端。

gets(字符數(shù)組) 從終端輸入一個(gè)字符串到字符數(shù)組,并且得到一個(gè)函數(shù)值,為該字符數(shù)組的首地址

strcat(字符數(shù)組1,字符數(shù)組2) 連接兩個(gè)字符數(shù)組中的字符串,數(shù)組1必須足夠大。

Strcpy(字符數(shù)組1,字符串2) 將字符串2拷貝到字符數(shù)組1中。

Strcmp(字符串1,字符串2) 比較字符串,相等返回0,字符串1字符串2,返回正數(shù),小于返回負(fù)數(shù)。

Strlen(字符數(shù)組) 求字符串長(zhǎng)度。

Strlwr( 字符串) 將字符串中的大寫(xiě)字母轉(zhuǎn)換成小寫(xiě)

Strupr( 字符串) 將字符串中的小寫(xiě)字母轉(zhuǎn)換成大寫(xiě)

以上是一些比較常用的字符串處理函數(shù)。

Top of Page

第七章 函數(shù)

1. 關(guān)于形參和實(shí)參的說(shuō)明

① 在函數(shù)被調(diào)用之前,形參不占內(nèi)存

② 實(shí)參可以是常量、變量或表達(dá)式

③ 必須指定形參的類(lèi)型

④ 實(shí)參與形參類(lèi)型應(yīng)一致

⑤ 實(shí)參對(duì)形參的數(shù)據(jù)傳遞是"值傳遞",即單向傳遞

2. 函數(shù)返回值

如果想讓函數(shù)返回一個(gè)值,在函數(shù)中就要用return語(yǔ)句來(lái)獲得,在定義函數(shù)時(shí)也要對(duì)函數(shù)值指定類(lèi)型,如果不指定,默認(rèn)返回整型。

3. 函數(shù)調(diào)用

1)注意在函數(shù)調(diào)用時(shí)實(shí)參和形參的個(gè)數(shù)、類(lèi)型應(yīng)一一對(duì)應(yīng)。對(duì)實(shí)參表求值的順序是不確定的,有的系統(tǒng)按自左至右,有的系統(tǒng)則按自右至左的順序。這一點(diǎn)要注意。

2)函數(shù)調(diào)用的方式:函數(shù)語(yǔ)句,函數(shù)表達(dá)式,函數(shù)參數(shù)

3)如果主調(diào)函數(shù)和被調(diào)函數(shù)在同一文件中,并且主調(diào)函數(shù)在前,那么一般要在主調(diào)函數(shù)中對(duì)被調(diào)函數(shù)進(jìn)行說(shuō)明。除非:(1)被調(diào)函數(shù)的返回值類(lèi)型為整型或字符型(2)被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之前。

4)對(duì)函數(shù)的說(shuō)明和定義是不同的,定義是指對(duì)函數(shù)功能的確立,包括指定函數(shù)名,函數(shù)值類(lèi)型,形參及其類(lèi)型、函數(shù)體等。說(shuō)明則只是對(duì)已定義的函數(shù)返回值類(lèi)型進(jìn)行說(shuō)明,只包括函數(shù)名、函數(shù)類(lèi)型以及一個(gè)空的括弧,不包括形參和函數(shù)體。

5)c語(yǔ)言允許函數(shù)的遞歸調(diào)用(在調(diào)用一個(gè)函數(shù)的過(guò)程中又出現(xiàn)直接或間接的調(diào)用該函數(shù)本身)。

4. 數(shù)組作為函數(shù)參數(shù)

1)數(shù)組元素作為函數(shù)參數(shù) 和一般變量相同

2)數(shù)組名作參數(shù)應(yīng)該在主調(diào)和被調(diào)函數(shù)分別定義數(shù)組,形參數(shù)組的大小可以不定義。注意:數(shù)組名作參數(shù),不是單向傳遞。

3)多維數(shù)組作參數(shù),在被調(diào)函數(shù)中對(duì)形參數(shù)組定義時(shí)可以省略第一維的大小說(shuō)明,但不能省略第二維或更高維的說(shuō)明。

5. 局部變量和全局變量

從變量作用域角度分,變量可分為局部變量和全局變量。

1)內(nèi)部變量(局部變量)

在一個(gè)函數(shù)內(nèi)定義,只在函數(shù)范圍內(nèi)有效的變量。

2)外部變量(全局變量)

在函數(shù)外定義,可以為本文件其它函數(shù)所共用,有效范圍從定義變量的位置開(kāi)始

到本文件結(jié)束。建議盡量少使用全局變量,因?yàn)樗诔绦蛉繄?zhí)行過(guò)程中都占用

資源,而且使函數(shù)的通用性降低了。如果在定義外部變量之前的函數(shù)要想使用該

外部變量,則應(yīng)在該函數(shù)中用extern作外部變量說(shuō)明。

6. 動(dòng)態(tài)存儲(chǔ)變量與靜態(tài)存儲(chǔ)變量

從變量值存在的時(shí)間(生存期)角度來(lái)分,可分為靜態(tài)存儲(chǔ)變量和動(dòng)態(tài)存儲(chǔ)變量。靜態(tài)存儲(chǔ)指在程序運(yùn)行期間給變量分配固定的存儲(chǔ)空間,動(dòng)態(tài)存儲(chǔ)指程序運(yùn)行期間根據(jù)需要?jiǎng)討B(tài)的給變量分配存儲(chǔ)空間。

C語(yǔ)言中,變量的存儲(chǔ)方法分為兩大類(lèi):靜態(tài)存儲(chǔ)類(lèi)和動(dòng)態(tài)存儲(chǔ)類(lèi),具體包括:自動(dòng)的(auto),靜態(tài)的(static),寄存器的(register),外部的(extern)。

1) 局部變量的存儲(chǔ)方式

函數(shù)中的局部變量如不作專(zhuān)門(mén)說(shuō)明,都之a(chǎn)uto的,即動(dòng)態(tài)存儲(chǔ)的,auto可以省略。局部變量也可以定義為static的,這時(shí)它在函數(shù)內(nèi)值是不變的。靜態(tài)局部變量如不賦初值,編譯時(shí)系統(tǒng)自動(dòng)賦值為0,動(dòng)態(tài)局部變量如不賦初值,則它的值是個(gè)不確定的值。C規(guī)定,只有在定義全局變量和局部靜態(tài)變量時(shí)才能對(duì)數(shù)組賦初值。為提高執(zhí)行效率,c允許將局部變量值放在寄存器中,這種變量叫register變量,要用register說(shuō)明。但只有局部動(dòng)態(tài)變量和形式參數(shù)可以作為register變量,其它不行。

2) 全局變量的存儲(chǔ)方式

全局變量在函數(shù)外部定義,編譯時(shí)分配在靜態(tài)存儲(chǔ)區(qū),可以在程序中各個(gè)函數(shù)所引用。多個(gè)文件的情況如何引用全局變量呢?假如在一個(gè)文件定義全局變量,在別的文件引用,就要在此文件中用extern對(duì)全局變量說(shuō)明,但如果全局變量定義時(shí)用static的話(huà),此全局變量就只能在本文件中引用了,而不能被其它文件引用。

3) 存儲(chǔ)類(lèi)別小結(jié)

從作用域角度分,有局部變量和全局變量

局部變量:自動(dòng)變量,即動(dòng)態(tài)局部變量(離開(kāi)函數(shù),值就消失)

靜態(tài)局部變量(離開(kāi)函數(shù),值仍保留)

寄存器變量(離開(kāi)函數(shù),值就消失)

(形參可定義為自動(dòng)變量和寄存器變量)

全局變量:靜態(tài)全局變量(只限本文件引用)

全局變量(允許其它文件引用)

從存在的時(shí)間分,有靜態(tài)存儲(chǔ)和動(dòng)態(tài)存儲(chǔ)

動(dòng)態(tài)存儲(chǔ):自動(dòng)變量(本函數(shù)內(nèi)有效)

寄存器變量(本函數(shù)內(nèi)有效)

形參

靜態(tài)存儲(chǔ):靜態(tài)局部變量(函數(shù)內(nèi)有效)

靜態(tài)全局變量(本文件內(nèi)有效)

全局變量(其它文件可引用)

從變量值存放的位置分

靜態(tài)存儲(chǔ)區(qū):靜態(tài)局部變量

靜態(tài)全局變量

全局變量

動(dòng)態(tài)存儲(chǔ)區(qū):自動(dòng)變量和形參

寄存器內(nèi):寄存器變量

7. 內(nèi)部函數(shù)和外部函數(shù)

內(nèi)部函數(shù):只能被本文件中的其它函數(shù)調(diào)用,定義時(shí)前加static,內(nèi)部函數(shù)又稱(chēng)靜態(tài)函數(shù)。

外部函數(shù):可以被其它文件調(diào)用,定義時(shí)前加extern,如果省略,則隱含為外部函數(shù),在需要調(diào)用此函數(shù)的文件中,一般要用extern說(shuō)明。

Top of Page

第八章 預(yù)編譯處理

c編譯系統(tǒng)在對(duì)程序進(jìn)行通常的編譯之前,先進(jìn)行預(yù)處理。c提供的預(yù)處理功能主要有以下三種:1)宏定義 2)文件包含 3)條件編譯

1. 宏定義

不帶參數(shù)的宏定義

用一個(gè)指定的標(biāo)識(shí)符來(lái)代表一個(gè)字符串,形式:#define 標(biāo)識(shí)符 字符串

幾點(diǎn)說(shuō)明:

1) 宏名一般用大寫(xiě)

2) 宏定義不作語(yǔ)法檢查,只有在編譯被宏展開(kāi)后的源程序時(shí)才會(huì)報(bào)錯(cuò)

3) 宏定義不是c語(yǔ)句,不在行末加分號(hào)

4) 宏名有效范圍為定義到本源文件結(jié)束

5) 可以用#undef命令終止宏定義的作用域

6) 在宏定義時(shí),可以引用已定義的宏名

帶參數(shù)的宏定義

定義形式:#define 宏名(參數(shù)表) 字符串

這和函數(shù)有些類(lèi)似,但他們是不同的:

1) 函數(shù)調(diào)用時(shí),先求實(shí)參表達(dá)式值,再代入形參,而宏只是簡(jiǎn)單替換,并不求值

2) 函數(shù)調(diào)用是在程序運(yùn)行時(shí)分配內(nèi)存的,而宏展開(kāi)時(shí)并不分配內(nèi)存,也沒(méi)有返回值的概念

3) 對(duì)函數(shù)中的實(shí)參和形參都要定義類(lèi)型,而且要求一致,宏名無(wú)類(lèi)型,其參數(shù)也沒(méi)有類(lèi)型。

4) 函數(shù)只有一個(gè)返回值,而宏可以得到幾個(gè)結(jié)果

5) 宏替換不占運(yùn)行時(shí)間,只占編譯時(shí)間,而函數(shù)調(diào)用占運(yùn)行時(shí)間

2. 文件包含處理

#include "文件1" 就是將文件1的全部?jī)?nèi)容復(fù)制插入到#include位置,作為一個(gè)源文件進(jìn)行編譯。

在#include命令中,文件名可以用" "也可以用 ,假如現(xiàn)在file1.c中包含file2.h文件," "表示系統(tǒng)先在file1.c所在目錄中找file2.h,如果找不到,再按系統(tǒng)指定的標(biāo)準(zhǔn)方式檢索目錄, 表示系統(tǒng)直接按指定的標(biāo)準(zhǔn)方式檢索目錄。所以用" "保險(xiǎn)一點(diǎn)。

3. 條件編譯

條件編譯指不對(duì)整個(gè)程序都編譯,而是編譯滿(mǎn)足條件的那部分。條件編譯有以下幾種形式:

1)#ifdef 標(biāo)識(shí)符

程序段1

#else

程序段2

#endif

它的作用:當(dāng)標(biāo)識(shí)符在前面已經(jīng)被定義過(guò)(一般用#define),則對(duì)程序段1編譯,否則對(duì)程序段2編譯。

2)#ifndef 標(biāo)識(shí)符

程序段1

#else

程序段2

#endif

它的作用和#ifdef相反,當(dāng)標(biāo)識(shí)符沒(méi)被定義過(guò),對(duì)程序段1編譯,否則對(duì)程序段2編譯。

3)#if 表達(dá)式

程序段1

#else

程序段2

#endif

它的作用:當(dāng)表達(dá)式值為真(非0)時(shí),對(duì)程序段1編譯,否則對(duì)程序段2編譯。

Top of Page

第九章 指針

指針說(shuō)白了就是地址。指針變量就是用來(lái)存放指針(地址)的變量。

1. 變量的指針和指向變量的指針變量

讀起來(lái)很拗口,說(shuō)白了就是變量的地址和用來(lái)存放變量地址的地址變量。因?yàn)橐粋€(gè)變量在編譯的時(shí)候系統(tǒng)要為它分配一個(gè)地址,假如再用一個(gè)變量來(lái)存放這個(gè)地址,那么這個(gè)變量就叫做指向變量的指針變量,也就是用來(lái)存放變量地址的這么一個(gè)變量。所謂"指向"就是指存放××的地址,如指向變量的指針變量,"指向"就是指用來(lái)存放變量的地址,再如指向數(shù)組的指針變量,"指向"就是指存放數(shù)組的地址。只要理解了這個(gè),指針也就不難了。另外,還有指向字符串的指針變量,指向函數(shù)的指針變量,指向指針的指針變量等。

1) 指針變量的定義

形式:類(lèi)型標(biāo)識(shí)符 *標(biāo)識(shí)符 如:int *pointer;

要注意兩點(diǎn):*表示pointer是個(gè)指針變量,在用這個(gè)變量的時(shí)候不能寫(xiě)成*pointer, *pointer是pointer指向的變量。一個(gè)指針變量只能指向同一個(gè)類(lèi)型的變量。如上面

pointer只能指向int型變量。

2)指針變量的引用

兩個(gè)有關(guān)的運(yùn)算符:

取地址運(yùn)算符 a 就代表變量a的地址

* 指針運(yùn)算符 *a 就代表變量a的值

2. 數(shù)組的指針和指向數(shù)組的指針變量

數(shù)組的指針指數(shù)組的起始地址,數(shù)組元素的指針指數(shù)組元素的地址。

1)指向數(shù)組元素的指針變量的定義與賦值

定義和指向變量的指針變量定義相同,c規(guī)定數(shù)組名代表數(shù)組的首地址,即第一個(gè)數(shù)組元素地址。

2)通過(guò)指針引用數(shù)組元素

我們通常引用數(shù)組元素的形式是a[i],如果用指針可以這樣引用,*(a+i),或定義一個(gè)指針變量p,將數(shù)組a的首地址賦給p,p=a;然后用*(p+i)引用。

注意:指針變量p指向數(shù)組a首地址,則p++指向數(shù)組a的下一元素地址,即a[1]的地址。

3)數(shù)組名作函數(shù)參數(shù)

形參數(shù)組和實(shí)參數(shù)組之間并不是值傳遞,而是共用同一段地址,所以在函數(shù)調(diào)用過(guò)程中如果形參的值發(fā)生變化,則實(shí)參的值也跟著變化。

4)指向多維數(shù)組的指針和指針變量

以二維數(shù)組為居多。假設(shè)定義了一個(gè)二維數(shù)組a[3][4],那么

a代表整個(gè)二維數(shù)組的首地址,也代表第0行的首地址,同時(shí)也是第0行第0列的元素的首地址。a +0和a[0]代表第0行首地址,a+1和a[1]代表第一行的首地址。

假設(shè)a是一個(gè)數(shù)組的首地址,那么如果a是一維的,a+I代表第I個(gè)元素的地址,如果a是二維的,則a+I代表第I行的首地址。

那么第一行第二列的元素地址如何表示呢?a[1]+2或a[1][2]或*(a+1)+2。

我們只要記?。涸诙S數(shù)組中a代表整個(gè)數(shù)組的首地址,a[I]代表第I行的首地址,a[I]與*(a+I)等價(jià)就行了。只要運(yùn)用熟練了就沒(méi)什么復(fù)雜的了。

5)指向由m個(gè)整數(shù)組成的一維數(shù)組的指針變量

如:int (*p)[4],p是一個(gè)指向包含4個(gè)元素的一維數(shù)組,如果p先指向a[0],則p+1指向a[1],即p的增值是以一維數(shù)組的長(zhǎng)度為單位的,這里是4,舉個(gè)例子:

假設(shè)a[3][4]=,p先指向a[0]也就是數(shù)組a的首地址,那么p+1就是a[1]的首地址即元素9的地址,因?yàn)樵诙xp時(shí)int (*p)[4],定義一維數(shù)組長(zhǎng)度為4,所以p+1就等于加了一個(gè)一維數(shù)組的長(zhǎng)度4。

3. 字符串的指針和指向字符串的指針變量

1)字符串的表示形式

c中字符串有兩種表示形式:一種是數(shù)組,一種是字符指針

char string[]="I love c!";

char *str="I love c!";

其實(shí)指針形式也是在內(nèi)存中開(kāi)辟了一個(gè)數(shù)組,只不過(guò)數(shù)組的首地址存放在字符指針變量str中,千萬(wàn)不要認(rèn)為str是一個(gè)字符串變量。

2)字符串指針作函數(shù)參數(shù)

實(shí)際上字符串指針就是數(shù)組的首地址。

3)字符指針變量與字符數(shù)組的區(qū)別

① 字符數(shù)組由若干元素組成,每個(gè)元素存放一個(gè)字符,而字符指針變量只存放字符串的首地址,不是整個(gè)字符串

② 對(duì)數(shù)組初始化要用static,對(duì)指針變量不用。

③ 對(duì)字符數(shù)組賦值,只能對(duì)各個(gè)元素賦值,不能象下面這樣:

char str[14];

str="I love c!";

對(duì)指針變量可以,

char *str;

str="I love c!";

注意:此時(shí)賦給str的不是字符,而是字符串首地址。

④ 數(shù)組在定義和編譯時(shí)分配內(nèi)存單元,而指針變量定義后最好將其初始化,否則指針變量的值會(huì)指向一個(gè)不確定的數(shù).

嘎嘎。。。就這么多啦~~


本文標(biāo)題:c語(yǔ)言函數(shù)庫(kù)教程 c語(yǔ)言庫(kù)函數(shù)的使用方法
鏈接URL:http://weahome.cn/article/hjiohp.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部