㈠ c語言指針問題
C語言的大多語法都是簡單易懂的,這常常會給初學者一種「別人都說C語言難,我看也不過如此」的感覺。但是這種感覺常常會停止在初學者學到指針時,這是一些讀者跟我說的。
鑒於很多C語言初學者都覺得指針非常難,
小明定義了一個C語言函數 int f(int * ),為什麼 f(&5) 不能正常工作呢?
如果希望傳遞 5 給函數 f(),在C99中,可以使用下面這種方法:
f( (int[]){5} );
上面這行C語言代碼相當於定義了一個數組,並且數組只有一個元素 5,函數 f() 接收到的參數是該數組,只不過這一過程中的數組名沒有「顯示」。
拋開C99的這個特性,C語言調用 f(&5) 就不能這么寫了,而是需要藉助變數:
int five = 5;
f(&five);
在C語言中,接受某個值指針的函數是有可能通過該指針修改該值的(即使程序員無此打算,C語言還是會一直這么認為),因此只有變數才能勝任。在C語言中,常數是只讀的,只能作為右值,& 運算符是不能處理常數 5 的,f(&five) 會引發編譯錯誤。
f(&five) 會引發編譯錯誤
表達式 * p++ 增加了 p 指向的數值,還是指針 p 本身?
C語言中的 ++ 和 — 運算符的優先順序高於 * 運算符,所以 *p++ 其實就相當於 *(p++)。顯然,++ 運算符增加的是指針 p 本身的值,不過在指針 p 自增之前,*p++會先返回 p 指向的值。如果希望 ++ 運算符增加 p 指向的值,應該使用括弧運算符:(*p)++。
小明想使用指針操作數組里的數值,下面這段C語言代碼有什麼問題?
小明預計程序會輸出 3,但是程序卻輸出了「垃圾值」,他的C語言代碼如下,請看:
int array[5], i, *ip;
for(i = 0; i < 5; i++)
array[i] = i;
ip = array;
printf("%d\n", *(ip + 3 * sizeof(int)));
㈡ c語言如何輸出指針所指向的值
需要准備的材料分別有:電腦、C語言編譯器。
1、首先,打開C語言編譯器,新建一個初始.cpp文件,例如:test.cpp。
㈢ C語言指針/引用/取值
指針是一個存儲計算機內存地址的變數。從指針指向的內存讀取數據稱作指針的取值。指針可以指向某些具體類型的變數地址,例如int、long和double。指針也可以是void類型、NULL指針和未初始化指針。
根據出現的位置不同,操作符 * 既可以用來聲明一個指針變數,也可以用作指針的取值。當用在聲明一個變數時,*表示這里聲明了一個指針。其它情況用到*表示指針的取值。
&是地址操作符,用來引用一個內存地址。通過在變數名字前使用&操作符,我們可以得到該變數的內存地址。
// 聲明一個int指針
int*ptr;
// 聲明一個int值
int val = 1;
// 為指針分配一個int值的引用
ptr = &val;
// 對指針進行取值,列印存儲在指針地址中的內容
int deref = *ptr;
printf("%d\n", deref);
第2行,我們通過*操作符聲明了一個int指針。接著我們聲明了一個int變數並賦值為1。然後我們用int變數的地址初始化我們的int指針。接下來對int指針取值,用變數的內存地址初始化int指針。最終,我們列印輸出變數值,內容為1。
第6行的&val是一個引用。在val變數聲明並初始化內存之後,通過在變數名之前使用地址操作符&我們可以直接引用變數的內存地址。
第8行,我們再一次使用*操作符來對該指針取值,可直接獲得指針指向的內存地址中的數據。由於指針聲明的類型是int,所以取到的值是指針指向的內存地址存儲的int值。
說穿了,指針就是地址吧,這里可以把指針、引用和值的關系類比為信封、郵箱地址和房子。一個指針就好像是一個信封,我們可以在上面填寫郵寄地址。一個引用(地址)就像是一個郵件地址,它是實際的地址。取值就像是地址對應的房子。我們可以把信封上的地址擦掉,寫上另外一個我們想要的地址,但這個行為對房子沒有任何影響。
㈣ C語言指針問題。
這是一個運算順序的問題。注意括弧的運用。
(1) ++(*pointer)是先取值,再自增,當前pointer指向的是位置arr[3],取值後是2,*pointer的結果是2,2再自增,當然會得出3。
值得說明的是,這個括弧是可以省略的,此處括弧只起到增加程序可讀性的作用。
(2)*(pointer-2)是先移動指針,再取值。pointer-2是把指針從當前位置arr[3]回退兩個位置,指向了arr[1],再取值,也就是取出的元素6。
當然,這個括弧是不可省略的。
還有不明白之處,請留言。
㈤ 關於c語言中指針操作字元串和指針取值的問題
問題一里,如果你想列印字元串,printf第二個參數應該是地址而不是地址里的內容,
如果你想列印一個字元,應該是%c而不是%s
應該寫為printf("%s\n",(buf+1)); 或者 printf("%c\n",*(buf+1)); (輸出是e)
問題二和一應該是同樣的錯誤
printf("%s\n",p);是列印整個字元串'test'
如果你只列印一個字元,比如s
printf("%c\n",*(p+2));
㈥ C語言指針問題
首先,你提到的所有p應該是一個類型,也就是
int *p
即,整型指針類型,該類型與一維整型數組等效,即int []
然後一個個來
第一個,只有用在定義的時候才是對的,
int *p=a;意思是定義int*類型的p,初始化為a。等效於int *p;p=a;
第二個,先p+5,然後取值,等效於p[5],在p=a下,也就是a[5],這里其實是越界的,知道是這個意思就好
第三個,先取值,在值加2,p=a時,*p為a[0],這個就是a[0]+2
第四個和第五個類似,如果p=a,那麼四五完全等同,都是a[2]的地址
最後一個,對a[5]先取地址再取值,最終還是a[5],這個和第二個是等價的,當然,也一樣是越界
㈦ C語言中指針是什麼意思
1.指針就是1個變數,他也是一個存放內容的內存空間。
2.指針存放的內容是另一個內存空間的起始地址。不同於一般變數存放的就是變數值。
3.取值操作符*對於指針的作用是取得指針變數存放的內存地址裡面的值,不加*取出的是指針變數存放的值(就是一個內存地址)
上面3步,step by step 你就理解了.
㈧ C語言如何把指針指向的值賦值到變數上。。。
str1是個常量指針,不能對他進行賦值操作,
用也應該寫成p=str1;
另外初始化的話一般是char*
p=NULL;
或者char*
p;
p=NULL;
㈨ c語言用指針取值比用數組名取值快嗎
指針快
只不過現在計算機快了,幾乎沒有區別。
㈩ c語言 指針 取值
首先更正一下樓主錯誤,int 型的指針不可以用來獲取char型的地址的,這樣會產生錯誤,如果你的編譯系統沒有報錯,實際上也有錯誤。
第二,字元串實際上就是等於字元數組。
ptr = &str[2];
printf("%d",ptr);
reptr = *(ptr);
printf("%c",reptr);
printf("\n");
這個可以輸出的。就是C
ptr = &str[2];
printf("%c",*(ptr+1));
輸出的是第4個字元『/0』就是「空」,可能樓主由此判斷無法輸出
ptr = &str[1];
printf("%c",*(ptr+1));
就能輸出C了
int *應該不可以,不過 int的話就可以
char str[4] = "abc";
int ptr;
char reptr;
ptr =(int)&str[0];
printf("%d",(char *)ptr);
reptr = *((char *)ptr);
printf("%c",reptr);
printf("\n");
實際上利用強制類型轉換,用int來存數據,意義上char 和int都是整形,所以可以一定程度上轉換