我正在學習 c 以更好地理解記憶體。
char *name = "example";
*(&name 1) = (char*)'A';
std::cout << name << std::endl;
正在回傳示例而不是eAample。
我的想法是獲取“x”的記憶體地址并進行更改。
不是 const 所以我應該可以改變地址的值吧?
obs:我知道如何以其他方式做到這一點,我很想這樣做。
uj5u.com熱心網友回復:
本宣告
char *name = "example";
是無效的。
在 C 中,字串文字具有常量字符陣列的型別。這意味著你必須寫
const char *name = "example";
并且您可能不會更改字串文字。
即使在字串文字具有非常量字符陣列型別的 C 語言中,您也不能更改字串文字。任何更改字串文字的嘗試都會導致未定義的行為。
這個表達
&name 1
指標名稱之外的點。因此,取消參考指標運算式會*(&name 1)呼叫未定義的行為。
這個表達(char*)'A'也沒有意義。它表示您正在嘗試使用字符“A”的代碼值(例如,在 ASCII 中等于 65)作為記憶體地址。
你可以做的是以下
char name[] = "example";
*(name 1) = 'A';
std::cout << name << std::endl;
或者如果你想處理指標運算式,那么而不是
*(name 1) = 'A';
你可以寫
*(name 1) = *"A";
這是一個基于您的想法的演示程式。第一個基于范圍的 for 回圈將由支持 C 20 的編譯器編譯。否則,您可以像這樣重寫它
const char **p = name;
for ( const auto &letter : "example")
給你。
#include <iostream>
int main()
{
const char *name[sizeof( "example" )];
for ( const char **p = name; const auto &letter : "example")
{
*p = &letter;
}
*( name 1 ) = &"A"[0];
for ( const char **p = name; **p; p )
{
std::cout << **p;
}
std::cout << '\n';
}
程式輸出為
eAample
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/493272.html
上一篇:這個指標繪制正確嗎?
