看板 C_and_CPP 關於我們 聯絡資訊
剛又寫了一隻更小的程式... #include <stdio.h> #include <stdlib.h> int main(void) { char *str="defg"; int value=3; int *ptr; ptr=&value; printf("%d\n",*ptr); printf("%s\n",str); system("pause"); return 0; } 這裡觀念有點不清楚... 若是宣告是int... 在printf裡面就可以使用*ptr 但若是字串... 就只能用str 而不能用*str ※ 引述《tokyobabylon (paris)》之銘言: : 標題: [問題] 字串指標問題... : 時間: Thu Dec 31 18:22:14 2009 : : 剛寫了這隻小程式 : 發現字串指標的一些問題還是搞不太懂... : : : #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 : 推 VictorTom:str是char*, 所以*str或str[0]是一個char, 你用%s印它預 12/31 18:27 : → VictorTom:期你要給它一個字串的起點位址, 而你那樣寫相當於把一個 12/31 18:28 : → VictorTom:char的值給下去當字串的起點位址, 基本上crash是正常的. 12/31 18:28 : → VictorTom:要印單一的char字元出來, 應該改用 %c 而不是 %s :) 12/31 18:29 : → tokyobabylon:但是我在上方所設的是str="b",而非是設成str='b',我 12/31 18:36 : → tokyobabylon:是要印字串沒錯呀@@ 12/31 18:37 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 124.9.4.125
snowlike:*str是'd'非"defg"困擾的話換作s[]={'d','e'..'\0'}想想 12/31 19:47
althon:因為*ptr等同*(ptr+0)是要印'd',所以要用%c,這樣瞭嗎? 12/31 22:18
althon:用%s,告訴開頭位址,就會一直印下去,印到'\0'就會停止~ 12/31 22:19
althon:上面應該是str 非ptr... 12/31 22:22
visor:你首先要先去了解 %c %s %d 他後面要什麼型態的參數 01/02 12:59