1. 程式人生 > 其它 >c++中的printf、和cout和cin後面跟指標的問題

c++中的printf、和cout和cin後面跟指標的問題

printf裡面列印指標的問題

而在c語言中,使用printf只需要使用不同的格式就可以區分打印出是字串還是指標變數的值:

cout和cin後面跟指標的問題

cout<<mm 和cin>>nn;它是可以自己識別mm和nn是不是指標變數嗎?
答:cin後面只能跟char*的指標,別的型別指標(eg:int*)報錯; (這裡只是說cin後面跟的指標型別的限制,不涉及其它型別)
cout後面跟char*的指標,列印的是裡面的內容,cout後面跟int*的指標,列印的是地址
cin輸入時,如果給char* 會自動結束符嗎,會的;
char *p2;前提是p2指向有空間的地址


   cin >> * p2 ; //只是輸入一個字元
  cin >> p2 ; //輸入p2所指的空間內容 全部修改


在C語言裡,輸出一個字串的指標很方便,直接printf("%p/n",p);就輸出了。
而 C++ 裡 cout 太自作聰明瞭,為了省去我們迴圈輸出字元的麻煩, cout<<p<<endl; 被翻譯為輸出 p 指向的字串值。
這個時候要輸出 p 的指標值就只能先將其轉為 void * 再輸出。因為 void 型, cout 沒法輸出,只能乖乖輸出指標。
此外 cout<<&p<<endl; 是不可取的,它其實等效於 printf("%p/n",&p);


那個輸出流運算子被過載過,這樣更加方便輸出字串,因為字串比較特殊,用/0結尾,
所以這樣的過載可行,輸出到記憶體為 /0 的地方就可以,但是普通陣列沒有這樣的特性所以不過載,直接輸出地址

舉例說明

我們知道在c++中指標變數和指標所指向的記憶體是兩個完全不同的概念,指標變數裡邊存放的是一個地址,那麼我們怎麼輸出指標變數的值,以及怎麼輸入指標變數本身的地址呢?

char *p="abcde";
cout << hex << &p <<endl;//此處是輸入指標變數的地址
cout << hex << (void *)p<<endl;//
此處是輸出指標變數的值 即指標所指向記憶體的地址

(void *)強制型別轉換
因此,同樣的,對於怎麼訪問類物件中指標變數的值和類物件中指標變數的地址:

class name
{
public:
name(char *pn); ~name();
//protected:
char *pname; int size;
};

name::name(char *pn)
{
cout << " Constructing " << pn << endl;
pname = new char[strlen(pn) + 1];
if (pname != 0) strcpy(pname, pn);
size = strlen(pn);
}


void main()
{
name Obj1("NoName");
cout << hex << "obj1的地址是:" << &Obj1.pname << endl;//此處是輸出指標變數的地址
cout << hex << "obj2的地址是:" << (void *)Obj1.pname << endl;//此處是輸出指標變數的值
}