c語言constchar
㈠ C 語言中char* 和const char*的區別
C 語言中char* 和const char*的區別:
一、含義的區別
char* 表示一個指針變數,並且這個變數是可以被改變的。
const char*表示一個限定不會被改變的指針變數。
二、模式的區別
char*是常量指針,地址不可以改變,但是指針的值可變。
const char*是指向常量的常量指針,地址與值均不可變。
三、指針指向的內容的區別
char*指針指向的內容是可以改變的,是不固定的。賦值後在數據傳遞的過程中允許改變。
const char*指針指向的內容是固定的,不可改變的。對傳入的參數,不會對指針指向的內容進行修改
四、意義的區別
char* str確保str這個指針不會改變,但是這個指針裡面的內容可以改變。
const char* str確保*str的內容不會改變,也就是用str這個指針無法改變str這個指針指向的地址的內容,但是可以改變這個指針。
㈡ c語言const char和char有什麼區別,指針變數date有點懵,請幫我講解一下
有一個判斷 C 語言的聲明式的技巧,那就是「從右往左讀」,C++ 創始人 Bjarne Stroustrup 在其著作《The C++ Programming Language》中推薦了這種方法,《C 專家編程》中也提及了這種技巧。相比於其他的「根據 const 與其他詞素的距離判斷」、「根據 const 的前後關系判斷」等等,個人認為這是最人性化的方法。從某種意義上來說,C 編譯器在進行詞法分析的時候巧合地運用了這種範式來進行語義轉換,這一點在 Backus(上下文無關法) 範式中也有體現。
具體的方法是:
const char * A:A 是一個指針,指向 const char。
char const * A:A 是一個指針,指向 const char。
char * const A:A 是一個 const 指針,指向 char。
const char * const A:A 是一個 const 指針,指向 const char。
const char const * const A:A 是一個 const 指針,指向 const char,後面兩個(從右往左讀)有一個是多餘的。
看到給出的示例:
const char* date;
這是一個指向 const char 的指針,這說明指針本身可變,但是其指向的 char 是不可變的,而 date = "new string" 中常量字元串其實是一個指針,因為指針可變,所以這里沒問題。
但是如果寫成 char* const date,那麼這就是一個不可變的指針,但是其指向的 char 是可變的,這時候寫 date = "new string" 就會報錯:
error: cannot assign to variable 'date' with const-qualified type 'char *const'
但是如果嘗試如下語句:
char* const date = "Hello, world!";
date[0] = 'H';
編譯能通過,但是運行時會出錯:
zsh: bus error
匯流排錯誤是怎麼引起的呢?不是指向的 char 可變嗎?對,指向的 char 可變,所以編譯能通過,但是賦給 date 的是一個字面字元串,按照 C 語言操作內存的機制,嘗試更改字面字元串的會引起 bus error,至於具體的原因,可以繼續深入了解 C 語言的編譯機制和運行原理,這里不再贅述。
㈢ C語言,定義一個數組,元素的類型是const char*
#include"stdio.h"
#include"stdlib.h"
typedefstructstutttt
{/*定義結構體*/
charname[50];
charnum[50];
doublescore;
}stu;
stustudent,s[1000];
intn;
doublemax;
doubleaverage;
charfileI[20]="stuin.txt";
charfileO[20]="stuout.txt";
intcmp(constvoid*a,constvoid*b)
{
if(((stu*)a)->score<((stu*)b)->score)return1;
elsereturn-1;
}
voidSort()
{
qsort(s,n,sizeof(stu),cmp);
}
voidPnt()
{
inti;
for(i=0;i<n;i++)
{
printf("%s%s%.0lf ",s[i].num,s[i].name,s[i].score);
}
printf(" ");
}
voidRead()
{
n=0;
FILE*fp;
if((fp=fopen(fileI,"r"))==NULL)
{/*以只讀打開文件*/
printf("cannotopenfile");
getchar();
exit(0);
}
while(fscanf(fp,"%s%s%lf ",s[n].num,s[n].name,&s[n].score)!=EOF/*從文件讀*/)
{
n++;
}
fclose(fp);
}
voidSolve()
{
inti;
inth=0,e=0,l=0;
intm90_100=0,m80_89=0,m70_79=0,m60_69=0,m0_59=0;
charsss[81]="";/*"--------------------------------------------------------------------------------";*/
FILE*fp;
if((fp=fopen(fileO,"w"))==NULL)
{/*以只讀打開文件*/
printf("cannotopenfile");
getchar();
exit(0);
}
average=0;
max=0;
for(i=0;i<n;i++)
{
if(s[i].score>max)max=s[i].score;
average+=s[i].score;
}
average/=n;
puts("最高分的人:");
fputs("最高分的人: ",fp);
for(i=0;i<n;i++)
{
if(s[i].score<average)l++;
elseif(s[i].score>average)h++;
elsee++;
if(s[i].score>=90)m90_100++;
elseif(s[i].score>=80)m80_89++;
elseif(s[i].score>=70)m70_79++;
elseif(s[i].score>=60)m60_69++;
elsem0_59++;
if(s[i].score<max)continue;
printf("%s%s%.0lf ",s[i].num,s[i].name,s[i].score);
fprintf(fp,"%s%s%.0lf ",s[i].num,s[i].name,s[i].score);
}
printf(" ");
fprintf(fp," ");
printf("平均成績:%lf ",average);
printf("高於平均%d人 ",h);
printf("等於平均%d人 ",e);
printf("低於平均%d人 ",l);
fprintf(fp,"平均成績:%lf ",average);
fprintf(fp,"高於平均%d人 ",h);
fprintf(fp,"等於平均%d人 ",e);
fprintf(fp,"低於平均%d人 ",l);
puts("");
fputs("",fp);
printf("優秀(90~100)%d人數,百分比;%%%lf ",m90_100,100.0*m90_100/n);
printf("優秀(80~89)%d人數,百分比;%%%lf ",m80_89,100.0*m80_89/n);
printf("優秀(70~79)%d人數,百分比;%%%lf ",m70_79,100.0*m70_79/n);
printf("優秀(60~69)%d人數,百分比;%%%lf ",m60_69,100.0*m60_69/n);
printf("優秀(00~50)%d人數,百分比;%%%lf ",m0_59,100.0*m0_59/n);
fprintf(fp,"優秀(90~100)%d人數,百分比;%%%lf ",m90_100,100.0*m90_100/n);
fprintf(fp,"優秀(80~89)%d人數,百分比;%%%lf ",m80_89,100.0*m80_89/n);
fprintf(fp,"優秀(70~79)%d人數,百分比;%%%lf ",m70_79,100.0*m70_79/n);
fprintf(fp,"優秀(60~69)%d人數,百分比;%%%lf ",m60_69,100.0*m60_69/n);
fprintf(fp,"優秀(00~50)%d人數,百分比;%%%lf ",m0_59,100.0*m0_59/n);
fclose(fp);
printf(" 結果已經寫入文件%s ",fileO);
}
main()
{
inti;
Read();
Solve();
/*printf("來自文件的數據: ");*/
/*Pnt();*/
/*Sort();*/
/*printf("按分數降序排序後的數據: ");*/
/*Pnt();*/
getchar();
}
㈣ const char*和char*的區別是什麼
一、含義的不同
char* 表示一個指針變數,並且這個變數是可以被改變的。
const char*表示一個限定不會被改變的指針變數。
二、模式的不同
char*是常量指針,地址不可以改變,但是指針的值可變。
const char*是指向常量的常量指針,地址與值均不可變。
三、指針指向的內容的不同
char*指針指向的內容是可以改變的,是不固定的。賦值後在數據傳遞的過程中允許改變。
const char*指針指向的內容是固定的,不可改變的。對傳入的參數,不會對指針指向的內容進行修改
四、意義的不同
char* str確保str這個指針不會改變,但是這個指針裡面的內容可以改變。
const char* str確保*str的內容不會改變,也就是用str這個指針無法改變str這個指針指向的地址的內容,但是可以改變這個指針。
const是一個C語言(ANSI C)的關鍵字,具有著舉足輕重的地位。它限定一個變數不允許被改變,產生靜態作用。使用const在一定程度上可以提高程序的安全性和可靠性。
另外,在觀看別人代碼的時候,清晰理解const所起的作用,對理解對方的程序也有一定幫助。另外CONST在其它編程語言中也有出現,例如Pascal、C++、PHP5、B#.net、HC08 C、C#等。
以上內容參考網路 CONST
㈤ const char是什麼意思比如要把一個變數定義為const char有什麼作用呢
const char的意思是該字元是 常量類型的。
比如const char ch = 'a'; 是告訴編譯器,這個變數不會改變。
當你給這個變數重新賦值的時候,會發出warning,提示用戶。
我覺得你想問的是const char *和 char const * 以及char * const
Bjarne在他的The C++ Programming Language裡面給出過一個助記的方法: 把一個聲明從右向左讀。
char * const cp; ( * 讀成 pointer to )
cp is a const pointer to char
const char * p;
p is a pointer to const char;
㈥ C++語言中const char*的意思
const是一個C語言的關鍵字,它限定一個變數不允許被改變。使用const在一定程度上可以提高程序的安全性和可靠性。
如你所說的,const char*="abcdef";
char*在這個的函數中,不可以再另外賦值。
如後面有char*="abf";之類的,會報錯
㈦ c語言char和const char區別
char 和 const char 都是 char 型變數。
理論上來說,當變數未初始化,或未賦值時,你可以賦任意 值 給 它們。
一旦 賦值 後,const char 型變數的值 就 不允許 更改,不允許再賦新值。
而 char 型變數,你可以 隨時 更新,願賦新值 就可以賦新值。
但是,實際上,const char 型,只有在 初始化 時 才允許 賦 值。賦 後,不允許 再賦 值。
例如: const char cc = 'a';
所以 一旦 語句 中 出現 cc = 'b'; 甚至 不改變值 地 寫 一句 cc = 'a'; 都算 語法錯誤。
char 型,無所謂,例如:
char c;
int i;
for (i='a';i<='z';i++) { c = i; printf("%c ",c);}
輸出: a b c d e f g h i j k l m n o p q r s t u v w x y z