⑴ c語言怎麼把二維數組的字元串給到一維數組
按元素賦值:
遍歷一維數組,並將每個元素賦值到二維數組的對應元素上。
或者遍歷二維數組,將每個元素賦值為一維數組對應值上。
優點為操作靈活,可以按照需要任意賦值。
2 當一維數組和二維數組類型相同,而且賦值順序與一維數組中的存儲順序完全相同時,可以用memcpy的方式,直接一次性賦值。
如一維數組為a,二維數組為b,基礎類型為TYPE,需賦值元素個數為n,可以調用
memcpy(b,a,sizeof(TYPE)*n);
該方法有點為操作簡單,執行效率高。
不過所需滿足的前提條件多。在滿足上述所有條件時,用memcpy的方式更為簡單。
個就是apply的一個巧妙的用處,可以將一個數組默認的轉換為一個參數列表([param1,param2,param3] 轉換為 param1,param2,param3) 這個如果讓我們用程序來實現將數組的每一個項,來裝換為參數的列表。
⑵ c語言如何定義一個可變參數函數 如何調用其輸入的參數 分別
有專門的宏,處理可變參
void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
一個簡單的例子
voidsimple_va_fun(inti,...)
{
va_listarg_ptr;
intj=0;
va_start(arg_ptr,i);
j=va_arg(arg_ptr,int);
va_end(arg_ptr);
printf("i=%dj=%dn",i,j);
return;
}
intmain()
{
simple_va_fun(1);
simple_va_fun(1,2);
simple_va_fun(1,200);
return0;
}
⑶ 有沒有C語言大神,這個函數看不懂啊,請幫忙解釋下
( ( void ( * )( FIRM_REWRITE_PARAM *, uword ) )( void *)RAM_FIRM_REWRITING )( p_addr, *( ( uword *)__sectop( "CCHECKSUM" ) ) );
這是一個函數調用:
第一步,找實參列表:從最後一個右括弧)往前找與之匹配的左括弧(
( p_addr, *( ( uword *)__sectop( "CCHECKSUM" ) ) )
以上是函數實參列表:
(1)p_addr:某個地址(指針)
(2)__sectop( "CCHECKSUM" ):指向名為"CCHECKSUM"的section首地址
( uword *)__sectop( "CCHECKSUM" ) 將之強制轉換為uword*指針類型
*( ( uword *)__sectop( "CCHECKSUM" ) )解引用操作,即對應uword結構實體
第二步,確定函數名或函數指針:
( ( void ( * )( FIRM_REWRITE_PARAM *, uword ) )( void *)RAM_FIRM_REWRITING )
上面對RAM_FIRM_REWRITING進行了兩次強制轉換:
(1)第一次:(void *),即將RAM_FIRM_REWRITING強制轉換為void*指針類型
(2)第二次:( void ( * )( FIRM_REWRITE_PARAM *, uword ) ),接上,將RAM_FIRM_REWRITING最終強制轉換為void ( * )( FIRM_REWRITE_PARAM *, uword ) 指針類型。
void ( * )( FIRM_REWRITE_PARAM *, uword ) 是一個函數指針,這個函數接收兩個參數,類型為:FIRM_REWRITE_PARAM *和uword,返回值類型void。
由此,可推知第一步實參p_addr類型為FIRM_REWRITE_PARAM *。
而根據define,RAM_FIRM_REWRITING即( ubyte *)__sectop( "RAM_TOP" ),亦即指向名為"RAM_TOP"的section首地址(強制轉換為ubyte *指針類型)。猜測ubyte*即unsigned char*。
轉換為函數指針類型,才能執行相應函數調用。
⑷ c語言中什麼是參數
如何寫可變參數的C函數以及這些可變參數的函數編譯器是如何實現的呢?下面是我為大家整理的關於c語言的參數介紹及使用,希望可以幫到大家哦。
簡單的可變參數的C函數
下面我們來探討如何寫一個簡單的可變參數的C函數.寫可變參數的C函數要在程序中用到以下這些宏:
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(可變參數)的意思.
這些宏定義在stdarg.h中,所以用到可變參數的程序應該包含這個頭文件.下面我們寫一個簡單的可變參數的函數,改函數至少有一個整數參數,第二個參數也是整數,是可選的.函數只是列印這兩個參數的值.
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;
}
我們可以在我們的頭文件中這樣聲明我們的函數:
extern void simple_va_fun(int i, ...);
我們在程序中可以這樣調用:
simple_va_fun(100);
simple_va_fun(100,200);
從這個函數的實現可以看到,我們使用可變參數應該有以下步驟:
1)首先在函數里定義一個va_list型的變數,這里是arg_ptr,這個變數是指向參數的指針.
2)然後用va_start宏初始化變數arg_ptr,這個宏的第二個參數是第一個可變參數的前一個參數,是一個固定的參數.
3)然後用va_arg返回可變的參數,並賦值給整數j. va_arg的第二個參數是你要返回的參數的類型,這里是int型.
4)最後用va_end宏結束可變參數的獲取.然後你就可以在函數里使用第二個參數了.如果函數有多個可變參數的,依次調用va_arg獲取各個參數.
如果我們用下面三種 方法 調用的話,都是合法的,但結果卻不一樣:
1)simple_va_fun(100);
結果是:100 -123456789(會變的值)
2)simple_va_fun(100,200);
結果是:100 200
3)simple_va_fun(100,200,300);
結果是:100 200
我們看到第一種調用有錯誤,第二種調用正確,第三種調用盡管結果正確,但和我們函數最初的設計有沖突.下面一節我們探討出現這些結果的原因和可變參數在編譯器中是如何處理的.
可變參數在編譯器中的處理我們知道va_start,va_arg,va_end是在stdarg.h中被定義成宏的,由於1)硬體平台的不同 2)編譯器的不同,所以定義的宏也有所不同,下
面以VC++中stdarg.h里x86平台的宏定義摘錄如下(''號表示折行):
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語言 主函數形參最多有幾個
可以有任意多個,但是常用的是前三個:
第一個是一個整數,表示了傳入的參數數量(包含程序路徑本身在內)
第二個是一個字元指針數組,保存了傳入的各個參數(包含程序路徑本身在內,以字元串形式保存)
第三個是一個字元指針數組,保存了當前操作系統中的環境變數。
⑹ C 語言多線程怎麼讀文件高效
C語言---多個線程讀取文件,其代碼如下:
#include
#include
#include
#include
#include
#include
#define THREAD_NUM 25
typedef struct
{undefined
FILE *_fp;
int _nThreadId;//第幾個線程
sem_t *_semLock;
}IDD_THREAD_PARAM;
void *ThreadFunc(void *args)
{undefined
char sLine[100+1];
FILE *fpRead = ((IDD_THREAD_PARAM *)args)->_fp;
sem_t *semLock = ((IDD_THREAD_PARAM *)args)->_semLock;
int nId = ((IDD_THREAD_PARAM *)args)->_nThreadId;
sem_wait(semLock);
while(!feof(fpRead))
{undefined
memset(sLine,0,sizeof(sLine));
fgets(sLine,100,fpRead);
fprintf(stderr,"Thread ID-%d:%s",nId,sLine);
}
sem_post(semLock);
}
int main()
{undefined
pthread_t *pThreads;
sem_t semLock;
pThreads = (pthread_t *)malloc(THREAD_NUM*sizeof(pthread_t));
sem_init(&semLock,0,1);
FILE *fp = fopen("test.txt","r");
//開始線程循環
IDD_THREAD_PARAM param;
for(int i=0;i
{undefined
memset(param,0,sizeof(IDD_THREAD_PARAM));
param._fp = fp;
param._nThreadId = i;
param._semLock = &semLock;
pthread_create((pThreads+i),NULL,ThreadFunc,param);
}
for(int i=0;i
pthread_join(*(pThreads+i),NULL);
free(pThreads);
pThreads = NULL;
fclose(fp);
fp = NULL;
return 0;
}
⑺ c語言一個函數返回多個值
在C語言中,一般情況下函數的返回值是通過函數中的return語句來實現的,每調用一次return語句只能從函數中返回一個值。但在實際很多應用中,我們需要從函數中返回多個值,那我們可以用什麼方法實現呢?此時我們可以用三種方法來實現。
方法一:設置全局變數
全局變數是在函數外部定義的全局變數,它不屬於任何一個函數,其作用域是從變數的定義處開始,到本程序文件的結尾。在此作用域內,全局變數可為各個函數所引用。當我們需要函數返回多個值時,除了函數體中的return語句返回其中一個之外,其它的返回值我們可以通過定義全局變數來處理。因為根據全局變數的特點,在被調用函數中改變了多個全局變數和值,相當於其主調函數全局變數的值也發生了變化,也就相當於返回了多個值。
例如:利用一個函數求出正方形的周長和面積。
#include
double l=0;//定義全局變數l為正方形周長
void f(double a)//定義求面積和周長的函數
{ double s; s=a*a;//求面積
l=6*a;//求周長,並賦給全局變數l
return s;//僅返回面積的值
}
void main()
{ double a,area;
printf(「請輸入邊長:");
scanf("%f",&a);
area=f(a);//面積的值通過調用f函數返回值
printf(「面積為:%5.2lf\n」,area);
printf(「周長為:%5.2lf\n」,l);//周長即為全局變數l在f函數中改變後的值
}
上面的例子即用全局變數實現了函數中返回多值的情況,這種方式易懂。但是全局變數用多了會破壞代碼的安全性,結構性,這主要是全局變數在所有函數中都可以使用,從而其值的變化不確定,所以我們要慎用。
方法二:使用數組名或指針作為函數的形參
數組名或者指針實際為地址,而數組一般都包括多個元素,指針也可以指向一組數據的著地址,把數組名或者指針作為函數形參,實際上相當於主調函數的實參與形參共用地址,所以在函數中的數組元素發生改變即是實參也隨之改變。也相當於在調用函數時多個值返回給主調函數。
實例2:編寫函數求一維整形數組的最大值與最小值,並把最大值與最小值返回給主調函數。
方法:以指針方式傳遞該一維數組的地址,然後把數組的最大值與數組的第一個元素交換,把數組的最小值與最後一個元素交換。函數被調用完畢後,實參數組中的第一元素為數組的最大值,實參數組中最後一個元素為數組的最小值,從而實現返回數組的最大值與最小值的功能。程序參考代碼如下:
#include "stdio.h"
#include "conio.h"
void max_min(int *ptr,int n) /*定義求數組最大值最小值的函數,傳遞數組指針*/
{int i,j,k;/*j保存最大值所在位置,k保存最小值所在位置*/
int *temp;/*用於交換位置*/
*temp=*ptr;
for(i=0;i{
if(*ptr<*(ptr+i))/*最大值與第一個元素進行交換*/
{
k=i;
*temp=*ptr;
*ptr=*(ptr+k);
*(ptr+k)=*temp ;
}
if(*(ptr+n-1)>*(ptr+i))/*最小值與最後一個元素進行交換*/
{
j=i;
*temp =*(ptr+n-1);
*(ptr+n-1)=*(ptr+j);
*(ptr+j)= *temp ;}
}
}
/*調用最大最小值函數*/
main()
{
int A[6],i;
for(i=0;i<6;i++)
scanf("%d",&A[i]);
max_min(A,6);
printf("max=%d, min=%d\n \n",A[0],A[5]);
getch();
}
調試結果如下:
請輸入6個整形數,以空格隔開:
5 8 9 32 -6 4
max=32,min=-6
注意:該方法適用於多個返回值的數據類型一致的情況。當返回值數據類型不一致時,不適用該方法。
方法三:使用結構體指針作為函數的形參
編寫返回多個值的C語言函數,可以考慮採用結構體的方式去實現。如果返回的數個數值的數據類型不一致,可以通過定義全局變數實現有多個返回值的C語言函數,也可以考慮把要求返回的數個值定義成一個結構體,然後同樣以傳遞結構體指針方式把結構體的指針傳遞給形參結構體指針,那麼函數中對形參結構體的修改即是對實參結構體的修改,函數被調用後獲取的實參結構體成員即為函數的多個返回值,下面以實例演示該方法的應用。
實例3:編寫一個用戶自定義函數,允許用戶錄入學生的基本信息(包括學號、姓名、所屬班級、總評成績),並返回這些基本信息給主調函數。
方法:把學生基本信息定義成一個結構體,在用戶自定義函數中傳遞該結構體的指針,則自定義函數中對結構體成員的錄入操作即是對實參結構體成員的錄入操作,從而實現多個返回值。參考代碼如下:
#include "stdio.h"
#include "conio.h"
struct inf{/*定義學生結構體,分別包含成員學號、姓名、班別、總評成績*/
char xh[12];
char name[20];
char class[15];
int chj;
};
main(void)
{
struct inf a1; /*定義學生結構體類型變數*/
void xxxx(struct inf *ptr);
printf("請輸入學號,姓名,班別,總評成績,以空格隔開:\n") ;
xxxx(&a1);/*調用函數,以學生結構體類型變數地址作為實參*/
printf("學號:%s,姓名: %s,班別:%s,總評成績:%d",a1.xh, a1.name,a1.class,a1.chj);
getch();
}
void xxxx(struct inf *ptr)/*該函數實現對結構體成員數據的錄入操作*/
{
char xh1[12],name1[20],class1[15];
int chj1;
scanf("%s%s%s%d",xh1,name1,class1,&chj1);
strcpy(ptr->xh,xh1);
strcpy(ptr->name,name1);
strcpy(ptr->class,class1);
ptr->chj=chj1;
}
調試結果如下:
請輸入學號,姓名,班別,總評成績,以空格隔開:
200102LiLi200185
學號:200102,姓名: LiLi,班別:2001,總評成績:85
注意:當函數要求返回的多個值是相互聯系的或者返回的多個值數據類型不一致時可以採用該方法。
結束語
對於以上這三種方法,如果想要返回的數個值數據類型一致,可以考慮採用方法2;而對於不同數據類型的返回值,如果各個數值之間是相互聯系的,則方法3較為合適;方法1雖然在很多情況下都可以實現多個返回值的C語言函數,但畢竟全局變數應用過程中有很多危險,要慎重使用。
通過對以上幾種方法的分析講解,在教學過程中,學生再遇到這樣的問題時,就能根據返回值的情況選擇合適的途徑去實現多個返回值的C語言函數。另外,如果再遇到類似的無法用教材知識點去直接解決的問題時,他們基本都能舉一反三地嘗試採用間接方式去解決。
參考材料:http://blog.csdn.net/supreme42/article/details/7636475
http://wenku..com/link?url=