A. c語言 指針
是啊 前面賦值了 但是
for(i=0;i<10;i++)
*p++=i;
運算以後. p 就等於 &a[10] 了啊 p++ 這條對p指針進行了加操作
那個交換是交換的內容數值
/////假定 p1 指向的數位 50 , p2 指向的內容為 30
{
int temp; //定義變數,用來緩存中間數據
temp=*p1; //將p1指向的 內容數值緩存到 temp 中 *p1=50,temp=50,*p2=30
*p1=*p2; //p2指向的數值賦值給p1指針 *p1=30,temp=50,*p2=30
*p2=temp; //temp緩存的中間數據賦值給p2指針 *p1=30,temp=50,*p2=50
}
之所以沒有引入指針型變數 *temp 是因為沒有這個必要 ,因為指針運算是16位的,增加程序運算量不說, 你引入了 *temp 還是要給*temp賦值的,還是要引入一個普通變數,因為指針不賦值是沒法操作的
B. C語言指針解釋一下啊
%p 和 %d 顯示的是同樣的內容 只不過是兩種不同的形式
%d是十進制的形式
%p 指針形式 表現為十六進制
C語言中每個變數都有內存地址
而 & 操作符就是用來獲取變數的內存地址的。例如變數a的地址是123,那麼&a的值便是123,而a的值可以是任意的。
指針是用來保存變數的地址的,指針本身的值就是另外一個變數的地址。
所以在你的圖中,p的值是a的地址&a,而&p是指針自己的地址。
而*操作符,是用來獲取指針保存的地址的變數保存的值。
所以*p可以得到p保存的a的地址所在的變數a的值。
*p -> *(&a) -> a
C. c語言中指針訪問內存問題
在定義一個指針時如果還不確定讓它指向何處,就先給指針賦一個空值
例如int
*p=NULL;
這樣不會使你定義的指針稱為野指針,而且你在檢查的時候會一眼就看到這個指針的初始狀態,可以很容易知道現在該如何對其操作
D. c語言指針詳解
指針是一個特殊的變數,它裡面存儲的數值被解釋成為內存里的一個地址。數據在內存中的地址也稱為指針,如果一個變數存儲了一份數據的指針,我們就稱它為指針變數。
計算機中所有的數據都必須放在內存中,不同類型的數據佔用的位元組數不一樣,例如 int 佔用 4 個位元組,char 佔用 1 個位元組。
為了正確地訪問這些數據,必須為每個位元組都編上號碼,就像門牌號、身份證號一樣,每個位元組的編號是唯一的,根據編號可以准確地找到某個位元組。
C語言用變數來存儲數據,用函數來定義一段可以重復使用的代碼,它們最終都要放到內存中才能供 CPU 使用。數據和代碼都以二進制的形式存儲在內存中,計算機無法從格式上區分某塊內存到底存儲的是數據還是代碼。
當程序被載入到內存後,操作系統會給不同的內存塊指定不同的許可權,擁有讀取和執行許可權的內存塊就是代碼,而擁有讀取和寫入許可權(也可能只有讀取許可權)的內存塊就是數據。
CPU 只能通過地址來取得內存中的代碼和數據,程序在執行過程中會告知 CPU 要執行的代碼以及要讀寫的數據的地址。
如果程序不小心出錯,或者開發者有意為之,在 CPU 要寫入數據時給它一個代碼區域的地址,就會發生內存訪問錯誤。這種內存訪問錯誤會被硬體和操作系統攔截,強製程序崩潰,程序員沒有挽救的機會。
變數名和函數名為我們提供了方便,讓我們在編寫代碼的過程中可以使用易於閱讀和理解的英文字元串,不用直接面對二進制地址,那場景簡直讓人崩潰。
需要注意的是,雖然變數名、函數名、字元串名和數組名在本質上是一樣的,它們都是地址的助記符,但在編寫代碼的過程中,我們認為變數名表示的是數據本身,而函數名、字元串名和數組名表示的是代碼塊或數據塊的首地址。
(4)c語言指針緩存擴展閱讀
指針使用(* 和 &)
*&a可以理解為*(&a),&a表示取變數 a 的地址(等價於 pa),*(&a)表示取這個地址上的數據(等價於 *pa),繞來繞去,又回到了原點,*&a仍然等價於 a。
&*pa可以理解為&(*pa),*pa表示取得 pa 指向的數據(等價於 a),&(*pa)表示數據的地址(等價於 &a),所以&*pa等價於 pa。
對星號*的總結
在我們目前所學到的語法中,星號*主要有三種用途:
1、表示乘法,例如int a = 3, b = 5, c; c = a * b;,這是最容易理解的。
2、表示定義一個指針變數,以和普通變數區分開,例如int a = 100; int *p = &a;。
3、表示獲取指針指向的數據,是一種間接操作,例如int a, b, *p = &a; *p = 100; b = *p;。
E. 關於C語言指針!
c語言中的指針占內存就是4個位元組
p是指向char的指針,char佔一個位元組,所以p++在內存地址上增加一個位元組
而p1是指向指針的指針,一個指針變數佔4個位元組,所以p1++對應的內存地址增加了4個位元組
F. C語言如何釋放指針
為了避免釋放已經釋放了內存的指針內存,或沒有釋放內存,在c語言中最好是在定義指針時賦初值NULL,釋放後立即賦NULL,釋放時檢查指針值再決定釋放就避免釋放錯誤了,如:
int *a = NULL
int *b = (int*) malloc(sizeof(int) * 10);
int *c = NULL, *d = NULL;
c = b;
d = a;
/* 執行大量操作後 */
if(a != NULL) free(a);
if(b != NULL) free(b);
if(c != NULL) free(c);
if(d != NULL) free(d);
按照這樣規定,即使代碼再長,以及經過多次設計指針的函數調用,依然不會造成內存泄漏,或內存釋放錯誤!
G. c語言指針
i_pointer-----指針變數,它的內容是地址量:是定義一個存放地址的變數,即指針變數,其存放的是一個地址。
*i_pointer----指針的目標變數,它的內容是數據,就是指針變數的值(地址)所對應的存儲單元中存放的數據。
&i_pointer---指針變數佔用內存的地址,是指針變數i_pointer的地址,也就是存放地址的「指針變數i_pointer的地址「。
H. c語言指針保存地址問題
指針地址不管幾級 說穿了也不過就是一個和系統位數一樣的整數,你甚至是可以用一個int把他存起來
存起來是隨便你怎麼玩的 但是你要訪問最終的內容的時候,你就得需要知道他是幾級的
I. C語言指針
請參考以下程序,已編譯運行過,可以得到正確結果:
#include<stdio.h>
int main(){
int a,b,*pmax;
int *max(int*,int* );
printf("Enter a b:");
scanf("%d %d",&a,&b);
pmax=max(&a,&b);
printf("max=%d\n",*pmax);
scanf("%d",&a);
return 0;
}
int *max(int *a,int *b)
{
int *p;
p=*a>*b?a:b;
return(p);
}
J. c語言,關於指針
沒區別,如果兩個指針中間只有一個*就是兩個指針(指針是地址是整數)相乘;指針內容*p是有類型的,編譯器會對指針內容進行檢查,如果類型匹配乘法運算(或*重載運算),就可以通過編譯和運算。kp和pm是指針*kp 和 *pm是指針內容(k和m),*kp * *pm實質就是兩個指針內容進行相乘(k*m)。