程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> c語言-求問一個C語言字符指針的問題

c語言-求問一個C語言字符指針的問題

編輯:編程綜合問答
求問一個C語言字符指針的問題

#include
void Initialize (char * a, char * b) {
a[0] = 'T'; a[1] = 'h'; a[2] = 'i';
a[3] = 's'; a[4] = ' '; a[5] = 'i'; a[6] = 's';
a[7] = ' '; a[8] = 'A'; a[9] = '\0';
b = a;
b[8] = 'B';
}

#define ARRAY_SIZE 10
char a[ARRAY_SIZE];
char b[ARRAY_SIZE];
int main(int argc, char * argv[]) {
Initialize(a, b);
printf("%s\n\n%s\n", a, b);
return 0;
}

圖片說明

為什麼會得到這樣的輸出呢?

最佳回答:


void Initialize (char * a, char * b) {
// 在進入這個函數後,傳遞過來的a,b,被你現在定義的a,b所接受
// 但是我覺得你的這兩個形參名用得不好,你先前定義的是全局變量a, b,現在形參名又是a,b
// 對於本段代碼而言還好些,如果你寫的是另外一種函數聲明和實現方式,估計要出問題
// 下面這段代碼是把a這個數組設置內容,根據下標一一設定
a[0] = 'T'; a[1] = 'h'; a[2] = 'i';
a[3] = 's'; a[4] = ' '; a[5] = 'i'; a[6] = 's';
a[7] = ' '; a[8] = 'A'; a[9] = '\0';
// 而b=a,表示把a的首地址,賦值給b(b一開始存的是b自己那片空間的首地址)
// 現在相當於,a 和 b同時存放的是a數組的首地址,那麼它們內部的內容是相同的,都是你上面一一賦值的那些內容
b = a;
// 現在,你把b[8] = ‘B’;
// 說明你修改了b所指向的空間的內容,而b和a又是同時指向同一個空間,所以相當於a,b同時被修改
b[8] = 'B';
// 函數結束,返回main函數
// 但是要注意,在本函數裡面的a,b 都是指定義的形參,而不是全局變量a,b
// 所以,函數的最開始,形參a = 全局a, 形參b = 全局b;
// 然後,你對形參a進行賦值操作,相當於改變全局a 的內容,
// 緊接著,你把形參b = 形參a,此時表示,形參a, 形參b,全局a都是指向全局a這塊空間的
// 然後,你對形參b進行修改,表示你同時修改了這三個。
}

#define ARRAY_SIZE 10
char a[ARRAY_SIZE];
char b[ARRAY_SIZE];

// 程序從mian函數開始執行,但是,宏定義和全局變量會預先編譯好
int main(int argc, char * argv[]) {
// Initialize(a,b) 這句表示調用Initialize函數,並且將字符數組a,b作為參數傳遞過去。
// 此時問題就來了,事實上,數組的名字(就是,a,b),表示的是數組的首地址,也就是數組的第一個元素的地址。
// 此時程序進入Initialize函數內部
Initialize(a, b);
// 所以,到這行時,表示全局a的內容曾經被修改,而全局b還是空內容
printf("%s\n\n%s\n", a, b);
// 控制台輸出:This is B
return 0;
}

還有不明白的麼?

Pigyu0822
s951127937
s951127937
Pigyu0822
Pigyu0822
Pigyu0822
Pigyu0822
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved