簡體   English   中英

C ++中的字符指針

[英]Char Pointers in C++

有人告訴我strdup返回存儲字符串的地址。 因此,在我提到的程序中,要打印字符串,我以為我必須使用解引用運算符* ,但是如果這樣做,它僅打印第一個字符,而沒有使用解引用運算符,則可以得到整個字符串。 我什么時候使用解引用運算符都無法解決。

與直接分配const char

當我用int檢查它時,它會打印地址而不是值。 為什么不同。

程序:

#include <iostream>
#include <string.h>
using namespace std ;

int main()
{
    char* num = strdup("Adam ");
    cout << num << endl ;
    char *n = "Eve ";
    cout << n << endl;

    int *m = (int*)670;
    cout << m << endl ;
    cout << *m << endl;
}

在C中確實沒有字符串。 字符串存儲的地址字符串。

這很令人困惑,因為在C ++中有字符串,因此您擁有C ++字符串和C字符串,它們在C ++程序中都是合法的。 如果您具有C ++字符串的地址,則實際上必須使用解引用運算符(就像處理int一樣)。

要打印字符串,我以為我必須使用解引用運算符*

你錯了 char*是指向字符的指針。 如果取消引用字符的指針,則結果是指向的字符對象。

但是,如果我這樣做,它僅輸出第一個字符,並且不使用解引用運算符,那么我將得到整個字符串

這是因為如何指定接受字符指針的字符流的流插入運算符的重載來表現。 操作員將假定它是指向以空終止的字符串的第一個字符的指針,並且指定的行為是打印整個字符串。

當我用int檢查它時,它會打印地址

這是因為在給定整數指針時,未指定insert運算符來打印整個以null結尾的字符串。 畢竟,指向整數的指針不會指向字符串的字符。

指向整數的指針沒有單獨的重載。 有一個重載可以接受所有指針(字符指針除外,字符指針具有單獨的重載):void指針的重載-所有數據指針都隱式轉換為void指針。 在流中插入(字符除外)指針的指定行為是打印所指向的地址。

為什么不同。

因為指向字符的指針很特殊。 在字符串處理上下文中,幾乎總是假定它們是指向以空終止的字符串的第一個字符的指針。 這是一種習慣用法/慣例,其起源可以追溯到C語言,而C語言最初是從C語言派生的。


PS。 *m具有未定義的行為,因為您從未在地址670上創建過int對象。此外,程序泄漏了strdup分配的內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM