成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

arg函數(shù)使用方法c語(yǔ)言,C語(yǔ)言arg

正弦函數(shù)C語(yǔ)言編程

#include stdio.h

創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站設(shè)計(jì)、網(wǎng)站制作與策劃設(shè)計(jì),惠城網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:惠城等地區(qū)?;莩亲鼍W(wǎng)站價(jià)格咨詢:18980820575

#include math.h

#define EX 0.000001

#define PI 3.14159265

int main()

...{

double x=0.0, temp=1.0, sin=0.0;

int i;

printf("Please input a degree:");

scanf("%lf",x);

x=x*PI/180;

temp=x;

i=0 ;

while ( fabs(temp) EX ) ...{

sin += temp;

i += 2;

temp = (-1) * temp*x*x/( (i+1)*(i) );

}

printf("sin(%lf) = %lf ",x,sin);

printf("The number is %d ",i);

return 0;

}

c語(yǔ)言怎么創(chuàng)建線程和使用

1、添加線程相關(guān)的頭文件:#includepthread.h

2、線程創(chuàng)建函數(shù)是pthread_create()函數(shù),該函數(shù)的原型為:

int?pthread_create(pthread_t?*thread,pthread_attr_t?*attr,void*?(*start_routine)(void*),void?*arg);

3、線程退出函數(shù)是pthread_exit()函數(shù),該函數(shù)的原型為:

void?pthread_exit(void?*retval);

創(chuàng)建線程的示例程序如下:

/*

**程序說(shuō)明:創(chuàng)建線程函數(shù)pthread_create()函數(shù)的使用。

*/

#include?stdio.h

#include?pthread.h

#include?unistd.h

#include?stdlib.h

#include?string.h

//打印標(biāo)識(shí)符的函數(shù)

void?print_ids(const?char?*str)

{

pid_t?pid; //進(jìn)程標(biāo)識(shí)符

pthread_t?tid; //線程標(biāo)識(shí)符

pid=getpid(); //獲得進(jìn)程號(hào)

tid=pthread_self(); //獲得線程號(hào)

printf("%s?pid:%u?tid:%u?(0x%x)\n",

str,(unsigned?int)pid,(unsigned?int)tid,(unsigned?int)tid);?//打印進(jìn)程號(hào)和線程號(hào)

}

//線程函數(shù)

void*?pthread_func(void?*arg)

{

print_ids("new?thread:"); //打印新建線程號(hào)

return?((void*)0);

}

//主函數(shù)

int?main()

{

int?err;

pthread_t?ntid; //線程號(hào)

err=pthread_create(ntid,NULL,pthread_func,NULL); //創(chuàng)建一個(gè)線程

if(err?!=?0)

{

printf("create?thread?failed:%s\n",strerror(err));

exit(-1);

}

print_ids("main?thread:"); //打印主線程號(hào)

sleep(2);

return?0;

}

c語(yǔ)言中什么是參數(shù)

如何寫可變參數(shù)的C函數(shù)以及這些可變參數(shù)的函數(shù)編譯器是如何實(shí)現(xiàn)的呢?下面是我為大家整理的關(guān)于c語(yǔ)言的參數(shù)介紹及使用,希望可以幫到大家哦。

簡(jiǎn)單的可變參數(shù)的C函數(shù)

下面我們來(lái)探討如何寫一個(gè)簡(jiǎn)單的可變參數(shù)的C函數(shù).寫可變參數(shù)的C函數(shù)要在程序中用到以下這些宏:

void va_start( va_list arg_ptr, prev_param );

type va_arg( va_list arg_ptr, type );

void va_end( va_list arg_ptr );

va在這里是variable-argument(可變參數(shù))的意思.

這些宏定義在stdarg.h中,所以用到可變參數(shù)的程序應(yīng)該包含這個(gè)頭文件.下面我們寫一個(gè)簡(jiǎn)單的可變參數(shù)的函數(shù),改函數(shù)至少有一個(gè)整數(shù)參數(shù),第二個(gè)參數(shù)也是整數(shù),是可選的.函數(shù)只是打印這兩個(gè)參數(shù)的值.

void simple_va_fun(int i, ...)

{

va_list arg_ptr;

int j=0;

va_start(arg_ptr, i);

j=va_arg(arg_ptr, int);

va_end(arg_ptr);

printf(%d %dn, i, j);

return;

}

我們可以在我們的頭文件中這樣聲明我們的函數(shù):

extern void simple_va_fun(int i, ...);

我們?cè)诔绦蛑锌梢赃@樣調(diào)用:

simple_va_fun(100);

simple_va_fun(100,200);

從這個(gè)函數(shù)的實(shí)現(xiàn)可以看到,我們使用可變參數(shù)應(yīng)該有以下步驟:

1)首先在函數(shù)里定義一個(gè)va_list型的變量,這里是arg_ptr,這個(gè)變量是指向參數(shù)的指針.

2)然后用va_start宏初始化變量arg_ptr,這個(gè)宏的第二個(gè)參數(shù)是第一個(gè)可變參數(shù)的前一個(gè)參數(shù),是一個(gè)固定的參數(shù).

3)然后用va_arg返回可變的參數(shù),并賦值給整數(shù)j. va_arg的第二個(gè)參數(shù)是你要返回的參數(shù)的類型,這里是int型.

4)最后用va_end宏結(jié)束可變參數(shù)的獲取.然后你就可以在函數(shù)里使用第二個(gè)參數(shù)了.如果函數(shù)有多個(gè)可變參數(shù)的,依次調(diào)用va_arg獲取各個(gè)參數(shù).

如果我們用下面三種 方法 調(diào)用的話,都是合法的,但結(jié)果卻不一樣:

1)simple_va_fun(100);

結(jié)果是:100 -123456789(會(huì)變的值)

2)simple_va_fun(100,200);

結(jié)果是:100 200

3)simple_va_fun(100,200,300);

結(jié)果是:100 200

我們看到第一種調(diào)用有錯(cuò)誤,第二種調(diào)用正確,第三種調(diào)用盡管結(jié)果正確,但和我們函數(shù)最初的設(shè)計(jì)有沖突.下面一節(jié)我們探討出現(xiàn)這些結(jié)果的原因和可變參數(shù)在編譯器中是如何處理的.

可變參數(shù)在編譯器中的處理

我們知道va_start,va_arg,va_end是在stdarg.h中被定義成宏的,由于1)硬件平臺(tái)的不同 2)編譯器的不同,所以定義的宏也有所不同,下

面以VC++中stdarg.h里x86平臺(tái)的宏定義摘錄如下(''號(hào)表示折行):

typedef char * va_list;

#define _INTSIZEOF(n)

((sizeof(n)+sizeof(int)-1)~(sizeof(int) - 1) )

#define va_start(ap,v) ( ap = (va_list)v + _INTSIZEOF(v) )

#define va_arg(ap,t)

( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )

C語(yǔ)言的變參技術(shù),va_start,va_arg,va_end這幾個(gè)函數(shù)怎么用?

#include stdarg.h // 必須包含的頭文件

int Add(int start,...) // ...是作為占位符

{

va_list arg_ptr; // 定義變參起始指針

int sum=0; // 定義變參的和

int nArgValue =start; //

va_start(arg_ptr,start); // arg_ptr指向第一個(gè)變參

do

{

sum+=nArgValue; // 求和

nArgValue = va_arg(arg_ptr,int); // arg_ptr指向下一個(gè)變參

}

while(nArgValue != 0); // 判斷結(jié)束條件;結(jié)束條件是自定義為=0時(shí)結(jié)束

va_end(arg_ptr); // 復(fù)位指針

return sum;

}

函數(shù)的調(diào)用方法為Add(1,2,3,0);這樣,必須以0結(jié)尾,因?yàn)樽儏⒑瘮?shù)結(jié)束的判斷條件就是讀到0停止。

解釋:

所使用到的宏:

void va_start( va_list arg_ptr, prev_param );

type va_arg( va_list arg_ptr, type );

void va_end( va_list arg_ptr );

typedef char * va_list;

#define _INTSIZEOF(n) ((sizeof(n) + sizeof(int) - 1) ~(sizeof(int) - 1) )

#define va_start(ap,v) ( ap = (va_list)v + _INTSIZEOF(v) )

#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )

#define va_end(ap) ( ap = (va_list)0 )

1、首先把va_list被定義成char*,這是因?yàn)樵谖覀兡壳八玫腜C機(jī)上,字符指針類型可以用來(lái)存儲(chǔ)內(nèi)存單元地址。而在有的機(jī)器上va_list是被定義成void*的

2、定義_INTSIZEOF(n)主要是為了某些需要內(nèi)存的對(duì)齊的系統(tǒng).這個(gè)宏的目的是為了得到最后一個(gè)固定參數(shù)的實(shí)際內(nèi)存大小。在我的機(jī)器上直接用sizeof運(yùn)算符來(lái)代替,對(duì)程序的運(yùn)行結(jié)構(gòu)也沒有影響。(后文將看到我自己的實(shí)現(xiàn))。

3、va_start的定義為 v+_INTSIZEOF(v) ,這里v是最后一個(gè)固定參數(shù)的起始地址,再加上其實(shí)際占用大小后,就得到了第一個(gè)可變參數(shù)的起始內(nèi)存地址。所以我們運(yùn)行va_start(ap, v)以后,ap指向第一個(gè)可變參數(shù)在的內(nèi)存地址,有了這個(gè)地址,以后的事情就簡(jiǎn)單了。

這里要知道兩個(gè)事情:

⑴在intel+windows的機(jī)器上,函數(shù)棧的方向是向下的,棧頂指針的內(nèi)存地址低于棧底指針,所以先進(jìn)棧的數(shù)據(jù)是存放在內(nèi)存的高地址處。

(2)在VC等絕大多數(shù)C編譯器中,默認(rèn)情況下,參數(shù)進(jìn)棧的順序是由右向左的,因此,參數(shù)進(jìn)棧以后的內(nèi)存模型如下圖所示:最后一個(gè)固定參數(shù)的地址位于第一個(gè)可變參數(shù)之下,并且是連續(xù)存儲(chǔ)的。

|--------------------------|

| 最后一個(gè)可變參數(shù) | -高內(nèi)存地址處

|--------------------------|

|--------------------------|

| 第N個(gè)可變參數(shù) | -va_arg(arg_ptr,int)后arg_ptr所指的地方,

| | 即第N個(gè)可變參數(shù)的地址。

|--------------- |

|--------------------------|

| 第一個(gè)可變參數(shù) | -va_start(arg_ptr,start)后arg_ptr所指的地方

| | 即第一個(gè)可變參數(shù)的地址

|--------------- |

|------------------------ --|

| |

| 最后一個(gè)固定參數(shù) | - start的起始地址

|-------------- -| .................

|-------------------------- |

| |

|--------------- | - 低內(nèi)存地址處

(4) va_arg():有了va_start的良好基礎(chǔ),我們?nèi)〉昧说谝粋€(gè)可變參數(shù)的地址,在va_arg()里的任務(wù)就是根據(jù)指定的參數(shù)類型取得本參數(shù)的值,并且把指針調(diào)到下一個(gè)參數(shù)的起始地址。

因此,現(xiàn)在再來(lái)看va_arg()的實(shí)現(xiàn)就應(yīng)該心中有數(shù)了:

#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )

這個(gè)宏做了兩個(gè)事情,

①用用戶輸入的類型名對(duì)參數(shù)地址進(jìn)行強(qiáng)制類型轉(zhuǎn)換,得到用戶所需要的值

②計(jì)算出本參數(shù)的實(shí)際大小,將指針調(diào)到本參數(shù)的結(jié)尾,也就是下一個(gè)參數(shù)的首地址,以便后續(xù)處理。

(5)va_end宏的解釋:x86平臺(tái)定義為ap=(char*)0;使ap不再 指向堆棧,而是跟NULL一樣.有些直接定義為((void*)0),這樣編譯器不會(huì)為va_end產(chǎn)生代碼,例如gcc在linux的x86平臺(tái)就是這樣定義的. 在這里大家要注意一個(gè)問題:由于參數(shù)的地址用于va_start宏,所以參數(shù)不能聲明為寄存器變量或作為函數(shù)或數(shù)組類型. 關(guān)于va_start, va_arg, va_end的描述就是這些了,我們要注意的 是不同的操作系統(tǒng)和硬件平臺(tái)的定義有些不同,但原理卻是相似的.

本文題目:arg函數(shù)使用方法c語(yǔ)言,C語(yǔ)言arg
網(wǎng)站地址:http://jinyejixie.com/article36/dssdjpg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、網(wǎng)站收錄、App開發(fā)、自適應(yīng)網(wǎng)站、定制網(wǎng)站網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司
永和县| 肇东市| 璧山县| 合作市| 临朐县| 北流市| 平利县| 库伦旗| 开封县| 宾阳县| 昭觉县| 临澧县| 靖安县| 密山市| 黎城县| 元江| 万山特区| 大厂| 越西县| 惠来县| 大田县| 建始县| 临海市| 丹东市| 永城市| 台南县| 丰顺县| 永清县| 孟津县| 镇安县| 鄂尔多斯市| 托克逊县| 叶城县| 八宿县| 集安市| 眉山市| 民乐县| 静乐县| 宁化县| 磐安县| 依安县|