1.
創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、德陽網(wǎng)絡(luò)推廣、成都微信小程序、德陽網(wǎng)絡(luò)營銷、德陽企業(yè)策劃、德陽品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供德陽建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com
if(y
==
NULL
w
==
NULL
d
==
NULL)這個(gè)語法上是對的,但是邏輯上不對,應(yīng)該任何變量為空指針都不能執(zhí)行,所以改為if(y
==
NULL
||
w
==
NULL
||
d
==
NULL)
2.
if...else...
的用法問題,else后并不是一定要再加if的。而且if后面一定要有條件。
3.
循環(huán)只要是收斂的就可以用,但是要記得初始化
a=a初值;
b=b初值;
epsilon
=較小值;
for(c
=
abs(a-b);
cepsilon
;
c
=
abs(a-b);){
a
=
(a+b)/2;
b
=
sqrt(a*b);
}
4.
要修改y,w,d所指向的值,所以要用指針。否則直接用int
y,w,d的話只能修改函數(shù)內(nèi)部變量,不能帶出函數(shù)。(形參和實(shí)參的概念)
程序修改如下:
int
convertTime(int
days,
int
*y,
int
*w,
int
*d){
if(days
0){
return
1;
}
else
if(y
==
NULL
||
w
==
NULL
||
d
==
NULL){//去掉多余的if,并修改為||
return
1;
}
else{//去掉多余的if
int
a
=
days%365;
*y
=
days
/
365;
//可以直接這么寫,由于分子分母都是整數(shù),所以這里的除號(hào)是做整除
*w
=
a
/
7;
*d
=
a
%
7;
return
0;
}
}
#include stdio.h
void ToUpper(char *p);
int main(void)
{
char s[10];
printf("Please input a string:\n");
scanf("%s",s);//數(shù)組名就是數(shù)組地址,不用加取址符
ToUpper(s);//自定義函數(shù),在主函數(shù)中被調(diào)用時(shí),不用加類型
printf("The new string is %s\n",s);
return 0;
}
void ToUpper(char *p)
{
for(;*p!='\0';p++)//這里的 *p=0刪掉,*p=0等價(jià)于*p=NULL;也就是說你把指針p變成空指針了,沒有指向了
{
if(*p='a'*p='z')//這里少個(gè)指針符
*p=*p-'a'+'A';
}
}
空指針有以下三種用法:
(1)用空指針終止對遞歸數(shù)據(jù)結(jié)構(gòu)的間接引用。
遞歸是指一個(gè)事物由這個(gè)事物本身來定義。請看下例:
/*Dumb implementation;should use a loop */
unsigned factorial(unsinged i)
{
if(i=0 || i==1)
{
return 1;
}
else
{
return i * factorial(i-1);
}
}
在上例中,階乘函數(shù)factoriai()調(diào)用了它本身,因此,它是遞歸的。
一個(gè)遞歸數(shù)據(jù)結(jié)構(gòu)同樣由它本身來定義。最簡單和最常見的遞歸數(shù)據(jù)結(jié)構(gòu)是(單向)鏈表,鏈表中的每一個(gè)元素都包含一個(gè)值和一個(gè)指向鏈表中下一個(gè)元素的指針。請看下例:
struct string_list
{
char *str; /* string(inthiscase)*/
struct string_list *next;
};
此外還有雙向鏈表(每個(gè)元素還包含一個(gè)指向鏈表中前一個(gè)元素的指針)、鍵樹和哈希表等許多整潔的數(shù)據(jù)結(jié)構(gòu),一本較好的介紹數(shù)據(jù)結(jié)構(gòu)的書中都會(huì)介紹這些內(nèi)容。
你可以通過指向鏈表中第一個(gè)元素的指針開始引用一個(gè)鏈表,并通過每一個(gè)元素中指向下一個(gè)元素的指針不斷地引用下一個(gè)元素;在鏈表的最后一個(gè)元素中,指向下一個(gè)元素的指針被賦值為NULL,當(dāng)你遇到該空指針時(shí),就可以終止對鏈表的引用了。請看下例:
while(p!=NULL)
{
/*dO something with p-str*/
p=p-next;
}
請注意,即使p一開始就是一個(gè)空指針,上例仍然能正常工作。
(2)用空指針作函數(shù)調(diào)用失敗時(shí)的返回值。
許多C庫函數(shù)的返回值是一個(gè)指針,在函數(shù)調(diào)用成功時(shí),函數(shù)返回一個(gè)指向某一對象的指針;反之,則返回一個(gè)空指針。請看下例:
if(setlocale(cat,loc_p)==NULL)
{
/* setlocale()failed;do something*/
/* ...*/
}
返回值為一指針的函數(shù)在調(diào)用成功時(shí)幾乎總是返回一個(gè)有效指針(其值不等于零),在調(diào)用失敗時(shí)則總是返回一個(gè)空指針(其值等于零);而返回值為一整型值的函數(shù)在調(diào)用成功時(shí)幾乎總是返回一個(gè)零值,在調(diào)用失敗時(shí)則總是返回一個(gè)非零值。請看下例:
if(raise(sig)!=0){
/* raise()failed;do something*/
/* ... */
}
對上述兩類函數(shù)來說,調(diào)用成功或失敗時(shí)的返回值含義都是不同的。另外一些函數(shù)在調(diào)用成功時(shí)可能會(huì)返回一個(gè)正值,在調(diào)用失敗時(shí)可能會(huì)返回一個(gè)零值或負(fù)值。因此,當(dāng)你使用一個(gè)函數(shù)之前,應(yīng)該先看一下它的返回值是哪種類型,這樣你才能判斷函數(shù)返回值的含義。
(3)用空指針作警戒值
警戒值是標(biāo)志事物結(jié)尾的一個(gè)特定值。例如,main()函數(shù)的預(yù)定義參數(shù)argv是一個(gè)指針數(shù)組,它的最后一個(gè)元素(argv[argc])永遠(yuǎn)是一個(gè)空指針,因此,你可以用下述方法快速地引用argv中的每一個(gè)元素:
/*
A simple program that prints all its arguments.
It doesn't use argc ("argument count"); instread.
it takes advantage of the fact that the last
value in argv ("argument vector") is a null pointer.
*/
# include stdio. h
# include assert. h
int
main ( int argc, char * * argv)
{
int i;
printf ("program name = \"%s\"\n", argv[0]);
for (i=l; argv[i] !=NULL; ++i)
printf ("argv[%d] = \"%s\"\n", i, argv[f]);
assert (i = = argc) ; / * see FAQ XI. 5 * /
return 0; / * see FAQ XVI. 4 * /
}
int?swap_any(void?*s,?void?*t,?unsigned?n)
{
int?i;
char?j;
for(i=1;i=n;i++)
{
j=*(char*)s;???//void?*強(qiáng)制轉(zhuǎn)換成?char?*
*(char*)s=*(char*)t;
*(char*)t=j;
s++;
t++;
}
s-n;?//
t-n;?//和上一句一樣沒有用!!
}
語言定義中說明,?每一種指針類型都有一個(gè)特殊值——?“空指針”?——?它與同類型的其它所有指針值都不相同,?它“與任何對象或函數(shù)的指針值都不相等”;
不要返回指向棧內(nèi)存的指針或引用,因?yàn)闂?nèi)存在函數(shù)結(jié)束時(shí)會(huì)被釋放。
指針是個(gè)很強(qiáng)大的工具,可是正因?yàn)樗珡?qiáng)大,所以要操作它不是件易事。操作不當(dāng)造成的野指針,甚至?xí)鹣到y(tǒng)死機(jī)等比較嚴(yán)重的后果。
如果程序定義了一個(gè)指針,就必須要立即讓它指向一個(gè)我們設(shè)定的空間或者把它設(shè)為NULL,如果沒有這么做,那么這個(gè)指針里的內(nèi)容是不可預(yù)知的,即不知道它指向內(nèi)存中的哪個(gè)空間(即野指針),它有可能指向的是一個(gè)空白的內(nèi)存區(qū)域,可能指向的是已經(jīng)受保護(hù)的區(qū)域,甚至可能指向系統(tǒng)的關(guān)鍵內(nèi)存,如果是那樣就糟了,也許我們后面不小心對指針進(jìn)行操作就有可能讓系統(tǒng)出現(xiàn)紊亂,死機(jī)了
不可以.
如果形參為void
*型,那調(diào)用的時(shí)候也是要實(shí)參的.
如果不想用實(shí)參,
只能定義成void型.
或者定義成可變參數(shù)(...)