6

わかりました、これが無効であることはわかっています

 char char_A = 'A';
    const char * myPtr = &char_A;
    *myPtr = 'J'; // error - can't change value of *myP

[定数文字へのポインタを宣言したため]

なぜこれが有効なのですか?

 const char  *linuxDistro[6]={ "Debian", "Ubuntu", "OpenSuse", "Fedora", "Linux Mint", "Mandriva"};

for ( int i=0; i < 6; i++) 
cout << *(linuxDistro+i)<< endl;

*linuxDistro="WhyCanIchangeThis";// should result in an error but doesnt ? 
for ( int i=0; i < 6; i++) 
cout << *(linuxDistro+i)<< endl;

ご覧いただきありがとうございます。

4

4 に答える 4

12

あなたが書く

*linuxDistro =  "WhyCanIchangeThis";

の宣言がだったので、これは完全に有効ですlinuxDistro

const char *linuxDistro[6];

つまり、 への 6 つのポインタの配列ですconst char。つまり、ポインターが指す文字だけでなく、ポインター自体を変更できます。つまり、コンパイルできません

*linuxDistro[0] = 'B';

"Bebian"文字列には定数文字が含まれているため、文字列を取得するには...

おそらく必要なのは、定数文字への定数ポインターの配列です。

const char *const linuxDistro[6];
于 2012-11-13T06:41:16.827 に答える
3

*linuxDistro は引き続きポインタです。linuxDistro[0]*linuxDistro="WhyCanIchangeThis"です。古いアドレスの内容を変更するのではなく、新しいアドレスを指すようにポインタを変更するだけなので、問題ありません。

と書く**linuxDistro='a'とエラーになるはずです。

于 2012-11-13T06:44:19.753 に答える
1

charは ではないためchar[]、 にアクセスする*char[]、その最初の要素 (Debian) にアクセスします。

ポインターをシフトすると (例: +1)、配列の次の要素にアクセスします

ここに理解を深めるための良い例があります

#include <iostream>
using namespace std;

int main ()
{
  int numbers[5];
  int * p;
  p = numbers;  *p = 10;
  p++;  *p = 20;
  p = &numbers[2];  *p = 30;
  p = numbers + 3;  *p = 40;
  p = numbers;  *(p+4) = 50;
  for (int n=0; n<5; n++)
    cout << numbers[n] << ", ";
  return 0;
}

これは出力されます:

10、20、30、40、50、

于 2012-11-13T06:40:31.897 に答える
1

ポインターはメモリアドレスを格納する変数であるため、ポインターがconst同じメモリアドレスを格納し続ける場合、ポインター自体の値は変更できませんが、ポインターが指す値については何も言っていません。あなたが持っているものに応じて、指摘された値を変更することは許可された操作です。

于 2012-11-13T06:45:10.147 に答える