A. c語言聲明定義
不會出錯的。
只有說所有變數聲明、定義語句必須在其他執行語句之前。
這里int num = 10;也是定義語句,不算是賦值語句。
而且好像這條規則是較早版C語言中才有的,後來的C語言規范已經沒有這條要求了
B. c語言 聲明部分怎麼 選擇
聲明(declaration )指定了一個變數的標識符,用來描述變數的類型,是類型還是對象,或者函數等。
C. 回顧c語言中聲明和定義的區別
簡單地說,聲明就是告知編譯器,後續代碼中會有這樣東西,而定義是告知編譯器真的申請一塊內存來存儲這樣東西。
對於變數來說,聲明和定義幾乎是相同的,尤其是在同一個文件中聲明或者定義變數。但如果是使用其他源文件中的變數,可以使用extern關鍵字進行聲明,表示該變數由其他人定義,我這邊僅僅是拿過來用一下。
對於函數來說,如果只給定了函數的名稱、參數列表和返回值,就是聲明,告知使用者函數的樣子,而定義是除了聲明的三部分之外,還要包含函數體,說明函數是如何實現的。
D. c語言如何定義一個單項列表
#include<iostream>
usingnamespacestd;
structA
{
intx;
A*next;
};
A*Head;//頭指針
intk=0;//記錄創建鏈表個數
A*J_L();//創建鏈表
voidB_J(A*head,intx);//比較大小
voidshow(A*head);//輸出
voidmain()
{
A*t;
t=J_L();
B_J(t,k);
show(t);
}
voidB_J(A*head,intx)
{
A*m,*n;
intswap;
for(inti=0;i<(x-1);i++)
{
n=head;
m=n->next;
for(intj=0;j<(x-i-1);j++)
{
if((n->x)>(m->x))
{swap=n->x;n->x=m->x;m->x=swap;}
n=n->next;
m=n->next;
}
}
}
voidshow(A*head)
{
A*t=head;
while(t!=NULL)
{
cout<<t->x<<endl;
t=t->next;
}
}
A*J_L()
{
cout<<"請輸入,0退出";
A*p=newA;
k++;
A*d=Head=p;
cin>>p->x;
if(p->x==0)
{
k--;
deletep;Head=0;p=0;
}
while(1)
{
cout<<"請輸入,0退出";
p=newA;
k++;
d->next=p;
cin>>p->x;
if(p->x==0)
{k--;deletep;d->next=0;p=0;break;}
d=p;
}
returnHead;
}
E. c語言數組聲明問題
一般有四種數組定義方式,以一維數組為例:
//定義指定維數的數組
int arr[10];
//定義不指定維數的數組,數組維數有初化列表元素個數決定。
int arr[] = {1,2,4};
//定義指定維數的數組,初始化不完全時,系統將未初始化元素初始化為0
int arr[10] = {1,2};
//動態分配一個數組。下面分配了一個有10個元素的數組。
int *arr =(int *) malloc(10 * sizeof(int));
F. c語言的定義與聲明是什麼
聲明就是聲明一下我用到的變數或者類型,變數或者類型的實際定義並不一定在本文件內。
給變數分配了空間才叫做定義,否則就是聲明
比如extern int a; 是聲明,a的定義是在別處,這里並沒有為a分配空間。
比如int a;即是定義
函數以及類型,聲明就是用函數或者類型的頭部來聲明
比如 struct x;聲明 struct x{};定義
比如 int fun();聲明 int fun(){}定義
G. 關於C語言變數和數組的聲明問題
首先聲明變數了是有內存分配的。
如果定義數組後可以得到連續的內存分配(有時候特別佔用空間)。所以C語言出了鏈表(可以不連續的村一組數據)。
下面是C語言內存分配特性,可以參考。
1、C中內存分為四個區
棧:用來存放函數的形參和函數內的局部變數。由編譯器分配空間,在函數執行完後由編譯器自動釋放。
堆:用來存放由動態分配函數(如malloc)分配的空間。是由程序員自己手動分配的,並且必須由程序員使用free釋放。如果忘記用free釋放,會導致所分配的空間一直占著不放,導致內存泄露。
全局局:用來存放全局變數和靜態變數。存在於程序的整個運行期間,是由編譯器分配和釋放的。
文字常量區:例如char *c = 「123456」;則」123456」為文字常量,存放於文字常量區。也由編譯器控制分配和釋放。
程序代碼區:用來存放程序的二進制代碼。
例子(一)
int a = 0; //全局區
void main()
{
int b; //棧
char s[] = abc; //s在棧,abc在文字常量區
char *p1,*p2; //棧
char *p3 = 123456; //123456在常量區,p3在棧上
static int c =0; //全局區
p1 = (char *)malloc(10); //p1在棧,分配的10位元組在堆
p2 = (char *)malloc(20); //p2在棧,分配的20位元組在堆
strcpy(p1, 123456); //123456放在常量區
}
例子(二)
//返回char型指針
char *f()
{
//s數組存放於棧上
char s[4] = {'1','2','3','0'};
return s; //返回s數組的地址,但程序運行完s數組就被釋放了
}
void main()
{
char *s;
s = f();
printf (%s, s); //列印出來亂碼。因為s所指向地址已經沒有數據
}
2、動態分配釋放內存
用malloc動態分配內存後一定要判斷一下分配是否成功,判斷指針的值是否為NULL。
內存分配成功後要對內存單元進行初始化。
內存分配成功且初始化後使用時別越界了。
內存使用完後要用free(p)釋放,注意,釋放後,p的值是不會變的,仍然是一個地址值,仍然指向那塊內存區,只是這塊內存區的值變成垃圾了。為了防止後面繼續使用這塊內存,應在free(p)後,立即p=NULL,這樣後面如果要使用,判斷p是否為NULL時就會判斷出來。
NO.1
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str,hello world);
printf(str);
}
請問運行Test函數後會是什麼樣的結果?
NO.2
char *GetMemory(void)
{
char p[] = hello world;
retrun p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
問題同NO.1
NO.3
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str,100);
strcpy(str,hello);
printf(str);
}
問題同NO.1
NO.4
void Test(void)
{
char *str = (char *)malloc(100);
strcpy(str,hello);
free(str);
if(str != NULL)
{
strcpy(str,world);
printf(str);
}
}
問題同NO.1
我對以上問題的分析:
NO.1:程序首先申請一個char類型的指針str,並把str指向NULL(即str里存的是NULL的地址,*str為NULL中的值為0),調用函數的過程中做了如下動作:1申請一個char類型的指針p,2把str的內容到了p里(這是參數傳遞過程中系統所做的),3為p指針申請了100個空間,4返回Test函數.最後程序把字元串helloworld拷貝到str指向的內存空間里.到這里錯誤出現了!str的空間始終為NULL而並沒有實際的空間.深刻理解函數調用的第2步,將不難發現問題所在!(建議:畫圖理解)
NO.2:程序首先申請一個char類型的指針str,並把str指向NULL.調用函數的過程中做了如下動作:1申請一數組p[]並將其賦值為hello world(數組的空間大小為12),2返回數組名p付給str指針(即返回了數組的首地址).那麼這樣就可以列印出字元串"helloworld"了么?當然是不能的!因為在函數調用的時候漏掉了最後一步.也就是在第2步return數組名後,函數調用還要進行一步操作,也就是釋放內存空間.當一個函數被調用結束後它會釋放掉它裡面所有的變數所佔用的空間.所以數組空間被釋放掉了,也就是說str所指向的內容將不確定是什麼東西.
NO.3:正確答案為可以列印出hello.但內存泄漏了!
NO.4:申請空間,拷貝字元串,釋放空間.前三步操作都沒有任何問題.到if語句里的判斷條件開始出錯了,因為一個指針被釋放之後其內容並不是NULL,而是一個不確定的值.所以if語句永遠都不能被執行.這也是著名的"野"指針問題.所以我們在編寫程序釋放一個指針之後一定要人為的將指針付成NULL.這樣就會避免出現"野"指針的出現.有人說"野"指針很可怕,會帶來意想不到的錯誤.
H. 關於c語言的函數聲明
因為函數jiec()是你自己定義並編輯的,在C語言中凡是操作員自己定義的函數都要在使用前申明,在C語言中系統自帶的函數是通過include語句進行引用定義的,比如字元函數通過include<string.h>進行申明,即你要引用的字元函數都在string.h里定義了
I. c語言如何聲明字元串
C語言中沒有字元串類型的變數。
他只有字元變數類型char,所以字元串用變通的方式來表示。
第一是字元數組來表示字元串。用下面的語句聲明:
char a[10];
C語言中字元數組與字元串的唯一區別是字元串末尾有一個結束符'\0',而字元數組不需要。
如剛才聲明的a[10]是一個含有10個元素的字元數組,它也能存放含有9個元素的字元串。
第二種方式是直接用指針。語句是:
char *a;
用指針聲明的字元數組,大多數功能與字元數組表示字元串相同。但也有以下兩點不同,一是儲存位置不同,用字元數組表示時,字元串是存放在儲存器的變數區域內;而用指針表示的字元數組是存儲在儲存器的常量區內;第二個區別是字元數組的字元串可以更改,而指針表示的字元串不能更改。
有關字元串的賦值方法,如何引用,請參考相關書籍。
有什麼問題請留言。