第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

以下代碼是關(guān)于const常量的問題,求解釋~

以下代碼是關(guān)于const常量的問題,求解釋~

C C++
叮當(dāng)貓咪 2021-11-25 19:15:28
如下代碼:const a=2;int *p;p=(int *)&a;*p=1;cout<<a<<" "<<*p<<endl;輸出竟是2 1;誰解釋一下?在內(nèi)存中a地址中內(nèi)容的確被改,但輸出時(shí)總是原值...我少寫了個(gè)int.是 const int a=2;我就是看直接改不行,好不容易才想到的辦法.我查看內(nèi)存發(fā)現(xiàn)a地址里的內(nèi)容確實(shí)被改掉了.但a的值卻就是不變,那a的值到底存在哪啊?還是用的宏定義替換的方法?我以前這么作過:int a=2;const int *p=&a;int *q;q=(int*)p;*q=1;然后輸出*p是1啊 .
查看完整描述

2 回答

?
一只名叫tom的貓

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超3個(gè)贊

我來解釋下把,算了,直接給你寫個(gè)程序讓你看看把
const int a=20;
const int *p=&a;
與下面的對比
const int a=20;
int *p=&a;

現(xiàn)在來說一下,兩種情況,a都是常量,所以不管在哪一種情況下
a的值都不會改變的,而對于兩個(gè)指針變量,就不相同了,一個(gè)是const指針
而另外一個(gè)是非const指針,也就是說對于const指針的那種情況,其指針變量p的值與其指向的內(nèi)容a都不可改變,因?yàn)樗麄兌际莄onst修飾的,而對于非const指針,則表示其指針變量p的值是可以改變的,但是其指針變量所指向的內(nèi)容a依然是不可以改變的,所以你再看看你的那個(gè)程序了

const a=2; //你沒加類型難道編譯器沒報(bào)錯(cuò)?
int *p;
p=(int *)&a; //這里要注意啊,&a的類型是const int*,而p是int*的,你在這里進(jìn)行的類型的強(qiáng)制轉(zhuǎn)換,將const int*轉(zhuǎn)換成了int*,否則不能賦值的
*p=1;
cout<<a<<" "<<*p<<endl;
你可以對比下下面的程序
#include <iostream>
using namespace std;
int main()
{
const int a=2;
int *p;
p=&a; //會報(bào)錯(cuò)
*p=1;
cout<<a<<" "<<*p<<endl;
}

下面的

#include <iostream>
using namespace std;
int main()
{
const int a=2;
int *p;
p=(int*)&a; //不會報(bào)錯(cuò)
*p=1;
cout<<a<<" "<<*p<<endl;
}

有問題可以發(fā)消息給我

補(bǔ)充:
也不知道之前是怎么回復(fù)你的,不過,現(xiàn)在,收回上面的回復(fù)...
最后修改下,給個(gè)權(quán)威答案
#include<stdio.h>
int main()
{
const int a=3;
int *p=(int *)&a;
*p=6;
printf("%d\t%d\n", *p , p );
printf("%d\t%d\n", a , &a );
return 0;
}
你把它分別放到C++編譯器上和C編譯器上運(yùn)行這段代碼看看結(jié)果如何.如果你用C++編譯器編譯上述代碼,那么這個(gè)問題的原因是編譯器在編譯時(shí)自動優(yōu)化了const值,造成你的code變成 printf("%d\t%d\n", 3 , &a );
我在這里瞎插一句把,感覺就有點(diǎn)像#define N 10
然后用10替換了N的意味把,雖然這樣說不準(zhǔn)確
但就這樣理解把,的確是可以修改,只是編譯器優(yōu)化的緣故而導(dǎo)致輸出的和想象的不一樣了

這就是權(quán)威答案,如果你學(xué)過匯編,你可以上匯編試試
如果你用C語言編譯器,你會發(fā)現(xiàn),輸出的都是6,因?yàn)镃語言編譯器并沒有對它進(jìn)行優(yōu)化

底下是匯編代碼:

INCLUDELIB LIBCMT
INCLUDELIB OLDNAMES

CONST SEGMENT
$SG3833 DB '%d', 09H, '%d', 0aH, 00H
ORG $+1
$SG3834 DB '%d', 09H, '%d', 0aH, 00H
CONST ENDS
PUBLIC _main
EXTRN _printf:PROC
; Function compile flags: /Odtp
_TEXT SEGMENT
_a$ = -8 ; size = 4
_p$ = -4 ; size = 4
_main PROC
; File c:\documents and settings\hwp\桌面\test.cpp
; Line 3
push ebp
mov ebp, esp
sub esp, 8
; Line 4
mov DWORD PTR _a$[ebp], 3
; Line 5
lea eax, DWORD PTR _a$[ebp]
mov DWORD PTR _p$[ebp], eax
; Line 6
mov ecx, DWORD PTR _p$[ebp]
mov DWORD PTR [ecx], 6
; Line 7
mov edx, DWORD PTR _p$[ebp]
push edx
mov eax, DWORD PTR _p$[ebp]
mov ecx, DWORD PTR [eax]
push ecx
push OFF
SET $SG3833
call _printf
add esp, 12 ; 0000000cH
; Line 8
lea edx, DWORD PTR _a$[ebp]
push edx
push 3
push OFFSET $SG3834
call _printf
add esp, 12 ; 0000000cH
; Line 9
xor eax, eax
; Line 10
mov esp, ebp
pop ebp
ret 0
_main ENDP
_TEXT ENDS
END

看到了沒有....這里
; Line 8
lea edx, DWORD PTR _a$[ebp]
push edx
push 3
push OFFSET $SG3834
call _printf
add esp, 12 ; 0000000cH

直接是push 3
意思說直接輸出的是數(shù)值3而不是變量值



查看完整回答
反對 回復(fù) 2021-11-29
?
寶慕林4294392

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊

const a=2;
int *p;
p=(int *)&a; //使用了強(qiáng)制轉(zhuǎn)換,強(qiáng)制將const int * 轉(zhuǎn)換成 int * ,但這種強(qiáng)制轉(zhuǎn)換只是暫時(shí)的
*p=1;
cout<<a<<" "<<*p<<endl; //*p 實(shí)際上是

經(jīng)編譯
int a=2;const int *p=&a;int *q;q=(int*)p;*p=1;
有錯(cuò),其實(shí)不編譯也知道,因?yàn)閜被定義為指向類型為const int 的指針,當(dāng)進(jìn)行*p=1時(shí),其實(shí)是給常量賦值,當(dāng)然會有錯(cuò)。

你可以這么理解 const int *p,“自己為指向const int ”



查看完整回答
反對 回復(fù) 2021-11-29
  • 2 回答
  • 0 關(guān)注
  • 367 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號