『壹』 C語言 指針方法
#include<stdio.h>
int main()
{
int a,b,c,s[3],t;
int *x,*y,*z;//定義指針變數
x=&a;//將a的地址賦給指針x,下同
y=&b;
z=&c;
scanf("%d%d%d",x,y,z);
s[0]=*x;//將指針x所指向的變數值賦給數組s的第一個元素;依次類推
s[1]=*y;
s[2]=*z;
for(int i=0;i<3;i++)//冒泡排序
for(int j=0;j<3-i-1;j++)
if(s[j]<s[j+1])
{
t=s[j];
s[j]=s[j+1];
s[j+1]=t;
}
for(int i=0;i<3;i++)
printf("%d ",s[i]);
return 0;
}
『貳』 C++指針訓練,誰幫我做一下
(一) 填空題
1. 一個指針類型的對象佔用內存的______個位元組的存儲空間.
2. 一個指針類型指向一個數據對象,它保存著該數據對象的______,若數據對象為DataType類型,則該指針的類型為__________.
3. 若要把一個整形指針P轉換為字元指針,則採用的強制轉換表達式為__________.
4. 假定一個數據對象為int *類型,則採用的強制轉換表達式為________.
5. 假定P是一個指向整數對象的指針,則用___________表示該整數對象,用_________表示指針變數P的地址.
6. 假定P是一個指針,則*P++運算首先訪問____________,然後使_______的值增1.
7. 假定P是一個指針,則(*P)++運算首先訪問_____________,然後使_________的值增1.
8. 假定P所指對象的值為25,P+1所指對象的值為42,則*P++的值為________.
9. 假定P所指對象的值為25,P+1所指對象的指為42,則*++P的值為________.
10. 假定P所指對象的值為25,P+1所指對象的值為42,則執行(*P)++運算後,P所指對象的值為_______.
11. 假定P所指對象的值為25,P+1所指對象的值為42,則執行*(P++)或*P++運算後,P所指對象的值為________.
12. 假定A是一個一維數組,則A[i]的指針訪問方式為________.
13. 一個數組的數組名實際上是指向該數組__________元素的指針,並且在任何時候都不允許_______它.
14. 若要定義整形指針P並初始指向X,則所使用的定義語句為_______________.
15. 若P指向X,則______與X的表示是等價的.
16. 在一個二維數組int a[m][n]中,包含的一維元素a[i]的類型為________,訪問a[i]時返回值的類型為_______.
17. 假定a是一個二維數組,則a[i][j]的指針訪問方式為_____________.
18. 若y是x的引用,則&y和&x的值______,即為變數______的地址.
19. 招待int *p=new int[10]操作,使p指向動態分配的數組中下標為________的元素,該元素可表示為_______或_________.
20. 執行char *p=new char(『a』)操作後,p所指向的數據對象的值為_________.
21. 執行__________操作將釋放由P所指向的動態分配的數據空間.
22. 執行__________操作將釋放由P所指向的動態分配的數組空間.
__________________________
答案是:
1, 4
2, 起始地址,DataType*
3, (char*)P
4, (int*)
5, *P, &P
6, P指向的數據,P
7, P指向的數據,, P指向的數據
8, 25
9, 42
10, 26
11, 42
12, *(A+i)
13, 起始,修改
14, int *P = &X;
15, (*P)
16, int *, int[n]
17, *(*(a+i) + j)
18, 相同,x
19, 0, *p, p[0]
20, 'a'
21, delete
22, delete[]
『叄』 二維數組與指針、指針數組、數組指針的用法
二維數組和指針⑴ 用指針表示二維數組元素。
要用指針處理二維數組,首先要解決從存儲的角度對二維數組的認識問題。我們知道,一個二維數組在計算機中存儲時,是按照先行後列的順序依次存儲的,當把每一行看作一個整體,即視為一個大的數組元素時,這個存儲的二維數組也就變成了一個一維數組了。而每個大數組元素對應二維數組的一行,我們就稱之為行數組元素,顯然每個行數組元素都是一個一維數組
下面我們討論指針和二維數組元素的對應關系,清楚了二者之間的關系,就能用指針處理二維數組了。
設p是指向二維數組a[m][n]的指針變數,則有:
int* p=a[0];//此時P是指向一維數組的指針。P++後,p指向 a[0][1]。
如果定義int (*p1)[n];p1=a;p1++後,p1指向a[1][0];
則p+j將指向a[0]數組中的元素a[0][j]。
由於a[0]、a[1]┅a[M-1]等各個行數組依次連續存儲,則對於a數組中的任一元素a[i][j],指針的一般形式如下:
p+i N+j 相應的如果用p1來表示,則為 (p1+i)+j
元素a[i][j]相應的指針表示為:
( p+i N+j) 相應的如果用p1來表示,則為 ( (p1+i)+j)
同樣,a[i][j]也可使用指針下標法表示,如下:
p[i N+j]
例如,有如下定義:
int a[3][4]={{10,20,30,40,},{50,60,70,80},{90,91,92,93}};
則數組a有3個元素,分別為a[0]、a[1]、a[2]。而每個元素都是一個一維數組,各包含4個元素,如a[1]的4個元素是a[1][0]、a[1][1]、a[1]2]、a[1][3]。
若有:
int p=a[0];
則數組a的元素a[1][2]對應的指針為:p+1 4+2
元素a[1][2]也就可以表示為:( p+1 4+2)
用下標表示法,a[1][2]表示為:p[1 4+2]
特別說明:
對上述二維數組a,雖然a[0]、a都是數組首地址,但二者指向的對象不同,a[0]是一維數組的名字,它指向的是a[0]數組的首元素,對其進行「 」運算,得到的是一個數組元素值,即a[0]數組首元素值,因此, a[0]與a[0][0]是同一個值;而a是一個二維數組的名字,它指向的是它所屬元素的首元素,它的每一個元素都是一個行數組,因此,它的指針移動單位是「行」,所以a+i指向的是第i個行數組,即指向a[i]。對a進行「 」運算,得到的是一維數組a[0]的首地址,即 a與a[0]是同一個值。當用int p;定義指針p時,p的指向是一個int型數據,而不是一個地址,因此,用a[0]對p賦值是正確的,而用a對p賦值是錯誤的。這一點請讀者務必注意。
⑵ 用二維數組名作地址表示數組元素。
另外,由上述說明,我們還可以得到二維數組元素的一種表示方法:
對於二維數組a,其a[0]數組由a指向,a[1]數組則由a+1指向,a[2]數組由a+2指向,以此類推。因此, a與a[0]等價、 (a+1)與a[1]等價、 (a+2)與a[2]等價,┅,即對於a[i]數組,由*(a+i)指向。由此,對於數組元素a[i][j],用數組名a的表示形式為:
( (a+i)+j)
指向該元素的指針為:
*(a+i)+j
數組名雖然是數組的地址,但它和指向數組的指針變數不完全相同。
第一,指針變數的值可以改變,即它可以隨時指向不同的數組或同類型變數,而數組名自它定義時起就確定下來,不能通過賦值的方式使該數組名指向另外一個數組。
第二,數組名是指針,類型是指向元素類型的指針,但值是指針常量,聲明數組時編譯器會為聲明所指定的元素數量保留內存空間。數組指針是指向數組的指針,聲明指針變數時編譯器只為指針本身保留內存空間。
例4 求二維數組元素的最大值。
該問題只需對數組元素遍歷,即可求解。因此,可以通過順序移動數組指針的方法實現。
main()
{
int a[3][4]={{3,17,8,11},{66,7,8,19},{12,88,7,16}};
int p,max;
for(p=a[0],max= p;p<a[0]+12;p++)
if( p>max)
max= p;
printf("MAX=%d/n",max);
}
執行結果:
MAX=88
這個程序的主要演算法都是在for語句中實現的:p是一個int型指針變數;p=a[0]是置數組的首元素地址為指針初值;max= p將數組的首元素值a[0][0]作為最大值初值;p<a[0]+12是將指針的變化范圍限制在12個元素的位置內;p++使得每比較一個元素後,指針後移一個元素位置。
例5 求二維數組元素的最大值,並確定最大值元素所在的行和列。
本例較之上例有更進一步的要求,需要在比較的過程中,把較大值元素的位置記錄下來,顯然僅用上述指針移動方法是不行的,需要使用能提供行列數據的指針表示方法。
main()
{
int a[3][4]={{3,17,8,11},{66,7,8,19},{12,88,7,16}};
int p=a[0],max,i,j,row,col;
max=a[0][0];
row=col=0;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if( (p+i4+j)>max)
{
max= (p+i 4+j);
row=i;
col=j;
}
printf("a[%d][%d]=%d/n",row,col,max);
}
程序運行結果:
a[2][1]=88
⑶ 行數組指針
在上面的說明中我們已經知道,二維數組名是指向行的,它不能對如下說明的指針變數p直接賦值:
int a[3][4]={{10,11,12,13},{20,21,22,23},{30,31,32,33}}, p;
其原因就是p與a的對象性質不同,或者說二者不是同一級指針。C語言可以通過定義行數組指針的方法,使得一個指針變數與二維數組名具有相同的性質。行數組指針的定義方法如下:
數據類型 ( 指針變數名)[二維數組列數];
例如,對上述a數組,行數組指針定義如下:
int ( p)[4];
它表示,數組 p有4個int型元素,分別為( p)[0]、( p)[1]、( p)[2]、( p)[3] ,亦即p指向的是有4個int型元素的一維數組,即p為行指針
此時,可用如下方式對指針p賦值:
p=a;
(4)指針數組的定義
指針數組是指每個元素中存放的是指針。定義為 int *p[4];sizeof(p)=16,返回的是數組的總空間
『肆』 利用指針的方法,求數組中的最大數和最小數
代碼如下:
#include "stdafx.h"
#include "stdio.h"
int u,v;
find_u_v (int *p,int n)
{
int *q;
u=v=*p;
for(q=p;q<p+n;q++)
{if(u<*q) u=*q;
else if(v>*q) v=*q;
}
}
int main(int argc, char* argv[])
{ int i,num[10];
printf("intput 10 numbers ");
for(i=0;i<10;i++)
scanf("%d",&num[i]);
find_u_v(num,10);
printf(" u=%d;v=%d ",u,v);
}
(4)指針綜合訓練方法擴展閱讀
指針是編程語言中的一個對象,利用地址,它的值直接指向存在電腦存儲器中另一個地方的值。由於通過地址能找到所需的變數單元,可以說,地址指向該變數單元。因此,將地址形象化的稱為「指針」。
意思是通過它能找到以它為地址的內存單元。在高級語言中,指針有效地取代了在低級語言,如匯編語言與機器碼,直接使用通用暫存器的地方,但它可能只適用於合法地址之中。指針參考了存儲器中某個地址,通過被稱為反參考指針的動作,可以取出在那個地址中存儲的值。
作個比喻,假設將電腦存儲器當成一本書,一張內容記錄了某個頁碼加上行號的便利貼,可以被當成是一個指向特定頁面的指針;根據便利粘貼面的頁碼與行號,翻到那個頁面,把那個頁面的那一行文字讀出來,就相當於是對這個指針進行反參考的動作。