char* a和char a[]的區別

 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<stdio.h>
#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<stdio.h>
#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<stdio.h>
#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

發佈了23 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章