main()
{
char *p="abc123ABC";//char p[]="abc123ABC"
int i=0;
while(*(p+i)!='\0')
{
if(*(p+i)>=97 && *(p+i)<=122)
{
*(p+i)=*(p+i)-32;
}
else if(*(p+i)>=65 && *(p+i)<=90)
{
*(p+i)=*(p+i)+32;
}
else
*(p+i)=*(p+i);
i++;
}
printf("%s\n",p);
}
爲什麼出錯,改成char p[]="abc123ABC"爲什麼就對了????
//////////////////////////////////////////
char* p是一個指針,根本沒分配內存,他指向的"abc123ABC" 是隻讀的,不能改變,你在下面給他賦值肯定是錯的.而char p[]是一個數組,已經分配內存,是將"abc123ABC" 複製到該內存裏面,這個內存是可讀寫的
指針是不分配內存的,它指向的是系統的只讀的內存,而數組是分配內存的,就是將系統的只讀的內存裏面的值複製到它的內存裏面,因此可讀寫
char* p是定義的一個指針。。他指向的字符竄"abc123ABC" 是存在不可修改的區域(代碼區)的。。
而char p[]是一個數組。。他的內容存在棧區可以修改
char p[]="abc123ABC";
該條語句執行的是字符串數組的賦值操作是正確的
char *p="abc123ABC";
字符指針變量p指向字符串常量"abc123ABC"的首地址
字符串常量存放在數據區的“常量段”
所以當你訪問並修改時會內存出錯
正確的操作應該是:
char * p = (char * )malloc(10);
strcpy(p, "abc123ABC");
//////////////////////////////////////////////////////
////////////////////////////////////////////////////////
在C/C++中,指針和數組在很多地方可以互換使用,這使得我們產生一種錯覺,感覺數組和指針兩者是完全等價的,事實上數組和指針是有很大的區別的。
1.兩者在含義上的區別。
數組對應着一塊內存區域,而指針是指向一塊內存區域。其地址和容量在生命期裏不會改變,只有數組的內容可以改變;而指針卻不同,它指向的內存區域的大小可以隨時改變,而且當指針指向常量字符串時,它的內容是不可以被修改的,否則在運行時會報錯。
如:
#include<stdlib.h>
#include<string.h>
int main(void)
{
char *s1="123456789";
char *s2="123456";
strncpy(s1,s2,6);
printf("%s %s\n",s1,s2);
return 0;
}
在編譯時不會報錯,但是在運行時會報錯,原因在於企圖改變s1的內容,由於s1,s2指向的是常量字符串,其內容是不可修改的,因此在運行時不會通過。 而下面這個程序是可以運行通過的:
#include<stdlib.h>
#include<string.h>
int main(void)
{
char s1[10]="123456789";
char s2[10]="123456";
strncpy(s1,s2,6);
printf("%s %s\n",s1,s2);
return 0;
}
在VC++ 6.0上可以編譯運行通過,原因在於數組的內容是可以被修改的,這就充分體現了指針和數組的區別,並不是完全等價的。
2.計算內存容量的區別。
用運算符sizeof可以計算出數組的容量(字節數),而用sizeof卻無法計算指針所指內存的容量,用sizeof(p)得到的結果永遠是4或者2(即指針變量所佔內存單元的字節數,一般情況下指針變量佔2個或4個字節的內存單元)。在進行參數傳遞時,數組會自動退化爲同類型的指針。
看下面這段代碼和運行結果:
#include<stdlib.h>
#include<string.h>
void function(int a[])
{
printf("%d\n",sizeof(a));
}
int main(void)
{
int a[10]={1,2,3,4,5,6,7};
int *p=a;
printf("%d %d\n",sizeof(a),sizeof(p));
function(a);
return 0;
}
運行結果爲:
40 4
4
原博客地址:http://blog.sina.com.cn/s/blog_74a4593801019keb.html