c指標變數的問題,C語言指標變數大小的問題

2022-06-30 18:16:40 字數 5007 閱讀 5366

1樓:摘星文苑

*p=1,是把1賦值給p所指向的物件,而p=1是把1賦值給p,這個1是被當做位址的。

2樓:匿名使用者

*p=1和p=1是不同的概念,「p=1」是賦值語句,還有在c語言中「1」,「0」是作為真假來用的,就相當於布林型數一樣。這兩個語句都是合法的。區別就是指標「*」的意思是取位址的意思。

3樓:匿名使用者

p是乙個指標,他的值是記憶體中一塊記憶體的位址,如ff80h,*p則表示那塊位址中所儲存的值(如ff80h那個位址所儲存的值為234),所以當p = 1時,指的是將p改指向的位址為0001h;而*p意味著將那塊位址中所存的值改為1.

4樓:匿名使用者

*p=1,只有在p被初始化的情況下才能進行;p=1是不合法的,乙個為位址,乙個為值 *是指標運算子

5樓:潛音禕

*p是在把1賦給p所在位址的值,p=1就是把p這個位址賦值為1.

6樓:乖敏寶寶

*p = 1;在使用之前必須先將p指向乙個變數才能使用,否則p是野指標,也就是p沒有指向任何記憶體,1不知道放在**,而出錯,p = 1; 這個在平常情況下是不可以使用的,除非你編寫作業系統的時候給一些硬體的位址是常數,才能給指標賦常值,從而控制硬體,否則編譯出錯

c語言指標變數大小的問題

7樓:淦秀榮義雁

32位windows記憶體位址採用平坦結構,記憶體位址都是32位整數,而指標變數的實質就是記憶體位址。所以,不管哪一種型別的指標變數都是4個位元組大小。

8樓:悟天籟

對於這個你只要記住一句秘訣就好,指標的大小僅僅取決指標本身的大小,不取決於指標指向的大小。 還有就是還有乙個虛擬記憶體和實體地址的關係,有mmu對映,8086裡有硬體完成乙個位址偏移的過程,實體地址 = 基址*16 + 變址。

9樓:匿名使用者

你可以反彙編試試,好象會自動匹配.

c語言中變數指標輸出問題

10樓:匿名使用者

這和printf用%s的規則相關。

首先ps是乙個指向字元型資料的指標;printf用%s修飾輸出時需要提供乙個指標,這個指標指向的資料是字元型的,但printf將按照字串的規則來進行輸出,也就是輸出完這個指標指向的字元後,自動將指標加1,並判斷指向的字元是否為0,否則將輸出直至指向的資料為0為止,或者說找到字串結束標誌為止。

所以我們說,如果用%s修飾輸出是輸出字串,printf("%s\n",ps);,這句話要求提供乙個指標

而要輸出單個字元的話應當用printf("%c\n",*ps);這時要求提供乙個字元型資料,用*ps表示ps指向的字元資料正好。

11樓:

假設字串"this is a book"的位址分布如下:

值 位址

t 0030f8b0h 0030f8b1i 0030f8b2... ...

此時有char *ps="this is a book"; 由於ps是char型別指標變數,它的指標域只能儲存位址,我們知道"this is a book"是乙個字串陣列且拿到了首元素的位址就可以找到它整個字串,所以ps的指標域儲存了首字元的位址即t的位址0030f8b0,而格式輸出符%s,就是輸出字串之意,即從t開始輸出直至遇到\0符為止。

如果有printf("%c\n",*ps); 則取ps所指向的位址0030f8b0的值即字元t,換句說就是ps代表指標域即位址0030f8b0,再加上「*」就是取值的意思,合起來就是取位址0030f8b0的值即字元t.

12樓:匿名使用者

printf()函式是乙個可變引數的函式 編譯時它根本不知道它需要多少個引數(必須乙個以上) 和引數的型別 只能在執行時確定 如何確定? 第乙個引數灰常重要(char *) 它定義了後面接著多少個引數 和引數型別,printf函式通過分析字串 是否含有 %c %s 這些內容 就可以知道後面的引數個數和型別

%s 表示引數是char* 型別的 也就是乙個字串的首位址 對 它只得到乙個開始的位址 它沒有結束得到的位址 那printf如何確定字元在**結束(或者它有多少長?) 答案顯而易見 字串後面的0

當然你可以不傳入乙個位址

printf("%s",10);

10不是乙個有效的位址 printf知道它是有效還是沒有效的嗎? 它不知道 它只能傻傻地去訪問10這個位址 最終程式崩潰退出

printf("%s",",*ps);

傳遞給printf的是什麼? ps裡面的值! printf分析第乙個引數的知道它需要乙個char* 型別的引數

把ps的值看成是位址 而去訪問ps的值表示的位址(ps裡如果是'a' 對應的65這個位址)

位址非法 當然報錯退出

13樓:水星大使

不不不,你要知道,你前面用的是%s,那你後面用ps這個指標就可以整個字串了。。。你如果你用*ps輸出整個字串的內容,把前面的%s改成%c,乙個乙個輸出。。。。

%s就是輸出格式為字串,後面就跟指標不要*指標。

14樓:匿名使用者

ps的值就是字串首位址,如果用*ps只表示第乙個字元。另外printf 、scanf等函式內部都支援字串,所以不必在費心考慮取位址還是取值問題。

15樓:匿名使用者

注意printf的引數。

16樓:匿名使用者

32位windows記憶體位址採用平坦結構,記憶體位址都是32位整數,而指標變數的實質就是記憶體位址。所以,不管哪一種型別的指標變數都是4個位元組大小。

17樓:匿名使用者

樓主理解的對,ps就是代表變數的位址 *ps代表ps指向的位址空間存放的值

關於c語言中指標變數的問題

18樓:匿名使用者

int a = 15, b = 99, c = 22, d = 45;【a=15,b=99,c=22,d=45】

int *p = &a;【變數p指向變數a,p指向的單元的內容(*p)是15】

int *q = &b;【變數q指向變數b,q指向的單元的內容(*q)是99】

*p=c;【給p指向的單元賦值,而不是給p賦值,由於p指向變數a的單元,則相當於給a的內容賦值c的值】

*q=d;【同理】

後面語句中的*p賦值和變數定義語句中的*p賦值是不同的,變數定義int *p=&a;可以分解寫成int *p; p=&a;是它的簡寫形式,簡寫形式是給p賦值而不是*p,因為在變數定義語句中的*表示的是變數型別而不是指p指向的單元的意思,可以看成:int* p=&a;這裡的p變數型別是int *,後面的賦值是給變數賦值。

19樓:

因為p是指向a的指標,也就是說,p裡存放的是a的位址,所以*p=c,實際上是先取出p的內容作為位址,然後修改那個位址裡的內容為c,所以也就修改了啊。

q是一樣的道理。

20樓:匿名使用者

因為 p是指向a的位址、q是指向b的位址的~

c語言中 指標變數值傳遞的問題

21樓:匿名使用者

如果返回的指標指向的是區域性變數,則其值會因為被呼叫函式的結束而被系統改變。

即區域性變數在函式結束後,會被系統收回再利用,有可能會發生值的變化。

如果不是這樣,請提供**,幫你分析。

22樓:匿名使用者

不可能,請看例項。

main() : 5

show() : 5

press any key to continue#include

int *set(int *p) ;

void show(int *p)

int main()

23樓:匿名使用者

這要看你返回的指標指向的是不是區域性變數,你的問題很可以是返回的是乙個區域性變數的指標。當那個函式返回時,記憶體被**,在主函式裡列印時,是因為那塊內在沒被別的函式覆蓋,當你再呼叫別人函式的時候,那個位址的內容已經改變。這就是你的錯誤原因。

c語言指標變數問題求解

24樓:

迴圈條件錯誤:while(s<0)修改成:while(s>0)

main函式中,long * t;否則無法fun函式無法呼叫。

呼叫順序得按照你的定義順序。fun(t,s);

關於c語言指標變數問題

25樓:聽不清啊

這是庫函式printf("%s",string)的作用了。

函式呼叫時,把實參string的值複製了乙份給printf中的指標引數,然後,這個指標引數在移動,直到遇上'\0'才輸出結束。

26樓:

char* 和 char陣列比較特殊,它會一直向後找,直到找到'\0'為止

c語言指標變數問題,這樣做錯的原因具體是什麼呢

27樓:哥德**的憂鬱

是不是你忘了寫形參了,void swap()括號裡要寫形參哦。

28樓:匿名使用者

int *min = number;這裡定義了指標min,其指向第乙個元素。

同理max也是指向第乙個元素。

所以min = max,下面修改*min和*max的時候會修改同乙個位址,即第乙個元素。

可以直接賦指標。

if (*(number + i) < *min) min = number + i;

if (*(number + i) > *max) max = number + i;

就可以了。

c語言字元指標變數,C語言裡為什麼字元指標變數指向的字串常量中的內容是不可取代的?

對於printf這個函式,有著一系列的格式符號 比如你說的 d s不同的格式,有著不同的引數型別要求 比如 s 要求對應引數必須是char 型的 你例子中的string就是這一型別 所以不會出錯 如果換成printf s string string為char 型,對應的格式是 c 而 d對應的是整型...

C語言中定義函式,變數是指向指標的變數,呼叫時要怎麼呼叫

首先fact函式返回的是double型別,第乙個引數是double型的二維指標.所以是 c i fact c,y,z 因為double c 3 是二維double指標,c i 是乙個double一維指標,c i 就是double型資料。c是二維指標,可以傳過去 c i fact c,y,z c i ...

C語言如果用指標去使用變數,和直接使用變數有什麼不同

指標是c語言中的乙個重要概念,也是c語言的乙個重要特色。正確而靈活的運用它,可以有效地表示複雜的資料結構 能動態分配記憶體 方便地使用字串 有效而方便地使用陣列 在呼叫函式時能獲得乙個以上的結果 能直接處理記憶體單元位址等 c程式設計 第三版 你在舉例的時候說的直接引用資料的時候是幾乎沒有區別的,陣...