[問題] 字串指標問題...

看板C_and_CPP (C/C++)作者 (paris)時間16年前 (2009/12/31 18:22), 編輯推噓5(507)
留言12則, 4人參與, 最新討論串1/4 (看更多)
剛寫了這隻小程式 發現字串指標的一些問題還是搞不太懂... #include <stdio.h> #include <stdlib.h> // 用system("pause")要include stdlib.h這個header #include <assert.h> // 用assert()時要宣告assert.h #include<iostream.h> #include<cstdlib> #define EXAM_ASSERT(x) assert(x) //定義function-like macro EXAM_ASSERT // assert() 若其argument為0 則會中斷程式 /* 用ASSERT保證沒有定義的特性或功能不被使用。 */ void exam_fun(char* test_str) //這個exam_fun檢查傳進來的char pointer若內容是 NULL 就中斷程式 { EXAM_ASSERT(test_str!= NULL); } int main(void) { char *str=NULL; //str=(char *)malloc(sizeof(char)); //str=NULL; //cout <<"str "<< str <<endl; //尚未指定char* str的內容之前就要看他的內容 ,當! printf("&str=%p\n",&str); //pointer 已存在故可以看到他的位址 //cout <<"*str "<< *str <<endl; //一樣,char* str內容尚未指定前就要看他的內 容,當! str="b"; exam_fun(str); printf("str已經被指定一個值b\n"); printf("str=%p\n",str); printf("&str=%p\n",&str); printf("*str=%s\n",str); cout<<*str<<endl; system("pause"); return 0; } 問題1. 再最後一個printf中,為什麼要用printf("*str=%s\n",str)才可以過? 原本我是寫printf("*str=%s\n",*str)卻interrupt跳掉 我原本就是要str內含的值阿~~~~ 但是在更下面的cout<<*str ; 使用cout時卻可以過 而不是使用cout<<str ; 問題2. 我使用dev-c compile 雖然可以跑卻是有warning... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 124.9.4.125

12/31 18:27, , 1F
str是char*, 所以*str或str[0]是一個char, 你用%s印它預
12/31 18:27, 1F

12/31 18:28, , 2F
期你要給它一個字串的起點位址, 而你那樣寫相當於把一個
12/31 18:28, 2F

12/31 18:28, , 3F
char的值給下去當字串的起點位址, 基本上crash是正常的.
12/31 18:28, 3F

12/31 18:29, , 4F
要印單一的char字元出來, 應該改用 %c 而不是 %s :)
12/31 18:29, 4F

12/31 18:36, , 5F
但是我在上方所設的是str="b",而非是設成str='b',我
12/31 18:36, 5F

12/31 18:37, , 6F
是要印字串沒錯呀@@
12/31 18:37, 6F

12/31 21:51, , 7F
sizeof issue
12/31 21:51, 7F

12/31 22:06, , 8F
你想印什麼是一回事, 它實際上是什麼是一回事:)
12/31 22:06, 8F

12/31 22:09, , 9F
如果你寫的程式實際上沒有照著它應有的寫法, 程式只會照
12/31 22:09, 9F

12/31 22:09, , 10F
它被寫成的結果來運作, 至於理由, 與如何寫才能照你希望
12/31 22:09, 10F

12/31 22:09, , 11F
的運作, 就再琢磨一下吧XD
12/31 22:09, 11F

01/01 12:50, , 12F
要把str = "b" 當做 str = {'b', '\0'} 你就知道了
01/01 12:50, 12F
文章代碼(AID): #1BF7jOU3 (C_and_CPP)
文章代碼(AID): #1BF7jOU3 (C_and_CPP)