c語言指針
『壹』 c語言指針
變數賦值 是得到副本,如
t=a;
a=b;
b=t;
指針 則是指向同一個內存地址
因而獲得內存裡面的內容
如後者
『貳』 C語言的指針是什麼
針是C語言中廣泛使用的一種數據類型。 運用指針編程是C語言最主要的風格之一。利用指針變數可以表示各種數據結構; 能很方便地使用數組和字元串; 並能象匯編語言一樣處理內存地址,從而編出精練而高效的程序。指針極大地豐富了C語言的功能。 學習指針是學習C語言中最重要的一環, 能否正確理解和使用指針是我們是否掌握C語言的一個標志。同時, 指針也是C語言中最為困難的一部分,在學習中除了要正確理解基本概念,還必須要多編程,上機調試。只要作到這些,指針也是不難掌握的。
指針的基本概念 在計算機中,所有的數據都是存放在存儲器中的。 一般把存儲器中的一個位元組稱為一個內存單元, 不同的數據類型所佔用的內存單元數不等,如整型量佔2個單元,字元量佔1個單元等, 在第二章中已有詳細的介紹。為了正確地訪問這些內存單元, 必須為每個內存單元編上號。 根據一個內存單元的編號即可准確地找到該內存單元。內存單元的編號也叫做地址。 既然根據內存單元的編號或地址就可以找到所需的內存單元,所以通常也把這個地址稱為指針。 內存單元的指針和內存單元的內容是兩個不同的概念。 可以用一個通俗的例子來說明它們之間的關系。我們到銀行去存取款時, 銀行工作人員將根據我們的帳號去找我們的存款單, 找到之後在存單上寫入存款、取款的金額。在這里,帳號就是存單的指針, 存款數是存單的內容。對於一個內存單元來說,單元的地址即為指針, 其中存放的數據才是該單元的內容。在C語言中, 允許用一個變數來存放指針,這種變數稱為指針變數。因此, 一個指針變數的值就是某個內存單元的地址或稱為某內存單元的指針。圖中,設有字元變數C,其內容為「K」(ASCII碼為十進制數 75),C佔用了011A號單元(地址用十六進數表示)。設有指針變數P,內容為011A, 這種情況我們稱為P指向變數C,或說P是指向變數C的指針。 嚴格地說,一個指針是一個地址, 是一個常量。而一個指針變數卻可以被賦予不同的指針值,是變。 但在常把指針變數簡稱為指針。為了避免混淆,我們中約定:「指針」是指地址, 是常量,「指針變數」是指取值為地址的變數。 定義指針的目的是為了通過指針去訪問內存單元。
既然指針變數的值是一個地址, 那麼這個地址不僅可以是變數的地址, 也可以是其它數據結構的地址。在一個指針變數中存放一
個數組或一個函數的首地址有何意義呢? 因為數組或函數都是連續存放的。通過訪問指針變數取得了數組或函數的首地址, 也就找到了該數組或函數。這樣一來, 凡是出現數組,函數的地方都可以用一個指針變數來表示, 只要該指針變數中賦予數組或函數的首地址即可。這樣做, 將會使程序的概念十分清楚,程序本身也精練,高效。在C語言中, 一種數據類型或數據結構往往都佔有一組連續的內存單元。 用「地址」這個概念並不能很好地描述一種數據類型或數據結構, 而「指針」雖然實際上也是一個地址,但它卻是一個數據結構的首地址, 它是「指向」一個數據結構的,因而概念更為清楚,表示更為明確。 這也是引入「指針」概念的一個重要原因。
指針變數的類型說明
對指針變數的類型說明包括三個內容:
(1)指針類型說明,即定義變數為一個指針變數;
(2)指針變數名;
(3)變數值(指針)所指向的變數的數據類型。
其一般形式為: 類型說明符 *變數名;
其中,*表示這是一個指針變數,變數名即為定義的指針變數名,類型說明符表示本指針變數所指向的變數的數據類型。
『叄』 c語言中指針怎麼使用
1、使用場景
使用指針時,必須將它指向一個變數的地址或者為它分配空間方能使用,如下所示:
#include<stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
int a[5]={0,1,2,3,4};
int *b,*d;
int c=2;
int *e=a; //e指向a數組首地址
//*b=2; 無法直接初始化
//printf("%d ", *b);
e=e+2; //移動兩個地址單元
d=&c; //d指向c的地址來表示值
c=4; //修改原c變數的值,d指針的值會發生改變
b=(int *)malloc(sizeof(int));//為b分配一個int型空間來直接存儲值
*b=2;//分配空間後可以直接賦值了
printf("this is e,b,c,d :%d %d %d %d ",*e,*b,c,*d);
2、類型說明
(1)int *a :表示一個指向int型變數的指針,指向的是變數的地址單元
(2)char *b:表示一個指向char變數的指針
*a表示的是這個指針指向地址的值,a為此指針本身的地址,這點要明確,一般用*(a+1)、*(a+2)來表示值,如:
int nums[5]={0,1,2,3,4};
int *a=nums;
printf("%d %d %p ",*a,*(a+1),a);
(3)c語言指針擴展閱讀:
指針的運算
指針指向變數地址,若原變數的內容發生了變化,它本身也會發生變化,指針之間的運算一般為值運算和地址運算
(1)值運算:直接通過*運算方式,像a+*(a+1),結果為第一個元素與第二個元素相加。
int nums[5]={0,1,2,3,4};
int *a=nums;
(2)地址運算:通過a+i的方式.指針會指向a的下i個地址。
int nums[5]={0,1,2,3,4};
int *a=nums;
a=a+2;
printf("%d ",*a);
結果輸出2。
參考資料來源 :指針-網路
『肆』 c語言指針
首先,*和&一定是作用於指針類型,所以首先保證你的p一定是一個指針類型。
*操作符返回某個指針所指的類型的值
&操作符返回某個類型變數的存儲地址
下面來看:假如有一個整型變數i,它的值是100,存儲在地址0x000000F0上(不要在意地址的合理性,僅是假設),p是指向i的一個整型指針(即int
*p
=
&i),p存儲在地址0x000000F4上。下面:
*p
表示p所指整型的值,即i的值,10
&p表示整型指針p的存儲地址,即0x000000F4
*&p表示存儲在0x000000F4上的整型指針變數的值,即指針p的值,即0x000000F0(變數i的地址)
所以你的答案應該是:p與*&p一樣,而*p與i一樣
『伍』 C語言指針
在循環里, 可以看出 p[2]=&a[2*4], 所以 p[2]=&a[8]
也就是說p[2]是指向a數組中第9個元素的指針
p[2]+1就是將指針向後移動一個單位, 即指向a數組第10個元素(相當於&a[9])
括弧前面的星號是從地址中取得對應值, 也就是10
『陸』 C語言指針
fun函數在這里相當於什麼也沒干
雖然fun的參數列表是兩個指針, 但是按址傳遞的時候, 能夠互換的是地址所指向的變數, 而不是地址本身
a/b 也是變數(指針類型), 在fun里, a/b兩個值自己交換了, a/b對於所指向的int來說是按址傳遞, 但是按照指針來說還是按值傳遞, 原來地址所指向的內容(int值)並沒有發生變化, 所以輸出還是那樣
『柒』 C語言指針解釋
①* p++——取p指向的目標值4,並將p+1使其指向5,在表達式運算後++生效。
②(*p)++——(不計①的結果)將p指向的目標值4加1使其為5,在表達式運算後++生效。
③*( p++)——這與①完全一樣。
⑤++* p——取p指向的目標值4並增1生效後參與表達式運算。
⑥*++ p——將指針p增1移到指向下一元素並取得,即5。
『捌』 c語言指針的概念
指針是C語言中廣泛使用的一種數據類型。 運用指針編程是C語言最主要的風格之一。利用指針變數可以表示各種數據結構; 能很方便地使用數組和字元串; 並能象匯編語言一樣處理內存地址,從而編出精練而高效的程序。指針極大地豐富了C語言的功能。 學習指針是學習C語言中最重要的一環, 能否正確理解和使用指針是我們是否掌握C語言的一個標志。同時, 指針也是C語言中最為困難的一部分,在學習中除了要正確理解基本概念,還必須要多編程,上機調試。只要作到這些,指針也是不難掌握的。
指針的基本概念 在計算機中,所有的數據都是存放在存儲器中的。 一般把存儲器中的一個位元組稱為一個內存單元, 不同的數據類型所佔用的內存單元數不等,如整型量佔2個單元,字元量佔1個單元等, 在第二章中已有詳細的介紹。為了正確地訪問這些內存單元, 必須為每個內存單元編上號。 根據一個內存單元的編號即可准確地找到該內存單元。內存單元的編號也叫做地址。 既然根據內存單元的編號或地址就可以找到所需的內存單元,所以通常也把這個地址稱為指針。 內存單元的指針和內存單元的內容是兩個不同的概念。 可以用一個通俗的例子來說明它們之間的關系。我們到銀行去存取款時, 銀行工作人員將根據我們的帳號去找我們的存款單, 找到之後在存單上寫入存款、取款的金額。在這里,帳號就是存單的指針, 存款數是存單的內容。對於一個內存單元來說,單元的地址即為指針, 其中存放的數據才是該單元的內容。在C語言中, 允許用一個變數來存放指針,這種變數稱為指針變數。因此, 一個指針變數的值就是某個內存單元的地址或稱為某內存單元的指針。圖中,設有字元變數C,其內容為「K」(ASCII碼為十進制數 75),C佔用了011A號單元(地址用十六進數表示)。設有指針變數P,內容為011A, 這種情況我們稱為P指向變數C,或說P是指向變數C的指針。 嚴格地說,一個指針是一個地址, 是一個常量。而一個指針變數卻可以被賦予不同的指針值,是變。 但在常把指針變數簡稱為指針。為了避免混淆,我們中約定:「指針」是指地址, 是常量,「指針變數」是指取值為地址的變數。 定義指針的目的是為了通過指針去訪問內存單元。
既然指針變數的值是一個地址, 那麼這個地址不僅可以是變數的地址, 也可以是其它數據結構的地址。在一個指針變數中存放一
個數組或一個函數的首地址有何意義呢? 因為數組或函數都是連續存放的。通過訪問指針變數取得了數組或函數的首地址, 也就找到了該數組或函數。這樣一來, 凡是出現數組,函數的地方都可以用一個指針變數來表示, 只要該指針變數中賦予數組或函數的首地址即可。這樣做, 將會使程序的概念十分清楚,程序本身也精練,高效。在C語言中, 一種數據類型或數據結構往往都佔有一組連續的內存單元。 用「地址」這個概念並不能很好地描述一種數據類型或數據結構, 而「指針」雖然實際上也是一個地址,但它卻是一個數據結構的首地址, 它是「指向」一個數據結構的,因而概念更為清楚,表示更為明確。 這也是引入「指針」概念的一個重要原因。
『玖』 c語言,指針
#include<stdio.h>
void input(int *a,int n)
{int i;
for(i=0;i<10;i++)
scanf("%d",a+i);
}
void output(int *a,int n)
{int i;
for(i=0;i<10;i++)
printf("%d ",*(a+i));
printf("\n");
}
void fun(int *a,int n)
{int i,j,max,min,t;
max=min=0;
for(i=1;i<n;i++)
if(a[i]>a[max])max=i;
else if(a[i]<a[min])min=i;
t=a[0];a[0]=a[min];a[min]=t;
if(max==0)max=min;
t=a[n-1];a[n-1]=a[max];a[max]=t;
}
int main()
{ int i,j,a[10];
input(a,10);
fun(a,10);
output(a,10);
return 0;
}