c語言怎麼定義指針
A. c語言如何定義指針指向字元型二維數組
使用指針變數訪問二維數組的任意一個元素的方法:
1.使用列指針:定義一個列指針p,讓它指向二維數組的第0個元素
int a[3][4];
int *p;
p=&a[0][0];
//因為a[0]是第0行的數組名,所以p=&a[0][0]相當於p=a[0],因為a[i][j]前面共有i*4+j個元素
該二維數組的任意i行j列元素可表示為*(p+i*4+j)。
2.使用行指針:定義一個行指針p,讓它指向二維數組的第0行
int a[3][4];
int (*p)[4];
p=a; //也可以為p=&a[0];
其中* ( *(p+i)+j)表示任意一個i行j列的元素。
(1)c語言怎麼定義指針擴展閱讀:
數組的使用規則:
1.可以只給部分元素賦初值。當{ }中值的個數少於元素個數時,只給前面部分元素賦值。例如:static int a[10]={0,1,2,3,4};表示只給a[0]~a[4]5個元素賦值,而後5個元素自動賦0值。
2.只能給元素逐個賦值,不能給數組整體賦值。例如給十個元素全部賦1值,只能寫為:static int a[10]={1,1,1,1,1,1,1,1,1,1};而不能寫為:static int a[10]=1;請注意:在C、C#語言中是這樣,但並非在所有涉及數組的地方都這樣,資料庫是從1開始。
3.如不給可初始化的數組賦初值,則全部元素均為0值。
4.如給全部元素賦值,則在數組說明中, 可以不給出數組元素的個數。例如:static int a[5]={1,2,3,4,5};可寫為:static int a[]={1,2,3,4,5};動態賦值可以在程序執行過程中,對數組作動態賦值。這時可用循環語句配合scanf函數逐個對數組元素賦值。
網路-數組
B. C語言指針的定義
指針就是地址。
你說的是指針變數。
整形變數,浮點變數,字元變數,指針變數。通過起名的規律就知道指針變數是儲存地址的。
指針變數和其他變數的用法一樣,作用域一樣。在一個子涵數中定義指針變數,是局部變數,其他函數是不能用的。
不要把指針變數想的太復雜,地址(指針)也是數據,和其他字元數據,整形數據一樣,沒什麼差異。
當然,全局變數的指針變數當然可以多函數使用。
指針的定義:地址。
指針變數的定義:存儲指針的變數。
C. 論述C語言中指針的概念和作用,並舉例說明
1、指針概念:變數的地址(計算機內存位元組的編號)叫做指針,存放變數地址的變數叫指針變
量,
簡言之,指針是用來存放地址的。
2、作用:指向這個變數或數組的首地址,是變數的間接引用方式。其值如果改變,變數的值或數組元素的值也會跟著改變。程序對變數的操作實際上是對變數所在的存儲空間讀取和寫入數據。方便對變數的操作。
舉例說明:
int
a=3;/*定義一個整型變數a,並賦初值3*/
int
*p;/*定義一個指針變數P*/
p=&a;/*讓p指向a的首地址,也就是a的地址*/
程序為a分配一個2個位元組的存儲單元,假如2個位元組的地址分別為(ABCD1和ABCD2,唯一),那麼p裡面放的值就是ABCD1,不是3。這時可通過p直接引用a,實際上*p=3。以後不管a存放在內存中的哪個地方,只用通過調用p就可以引用a。這時如果令*p=4,則最後的a值也為4。對於數組,指針是指向數組的首地址。
D. C語言指針基本概念及其指針變數的定義是什麼
語言中,指針是一種類型,被稱為「指針類型」。指針類型描述的是一個地址,這個地址指向內存中另外一個對象的位置。簡單地說,指針表示的是它所指向對象的地址。
1、比較point,*point,&point三者的區別
對於int * point;
point:是指針變數,其內容是地址量。
*point:是指針變數的目標變數,即指針指向的那個變數,其內容是數據。
&point:是指指針變數本身所佔據的存儲地址。
2、指針與數組
用指針和數組名在訪問內存中的數據時,他們的表現形式是等價的,因為他們都是地址量。
數組名表示整個數組的首地址,可以看作是固定地址的指針,不能被賦值。
數組名無須賦初值,而指針在使用前必須賦初值。
3、字元指針和字元串
字元串是一個字元數組,字元串以『\0』結束。printf函數的%s格式輸出字元時,是從給定的地址開始,到遇上第一個『\0』字元時結束。
對字元指針初始化,是將字元串的首地址賦給指針。
4、指針型函數
所謂指針型函數,即返回值是指針(地址)的函數。
5、多級指針
指向指針的指針(**p)就是二級指針,指向指針的指針的指針(***p)是3級指針。
多級指針類似於間接定址。
6、指向函數的指針
C語言中的函數名表示函數的首地址,即函數執行的人口地址。
定義形式:[存儲類型][數據類型標示符](*指向函數的指針變數名)();
例子: int(*fun)();//指向函數的指針 , int * fun(); //指針型函數,注意(* fun)括弧不能少
7、動態指針
當需要一大片內存的時候,最好使用動態分配。
使用malloc函數:void * malloc(size_t size)。
例子:
int * pn=malloc(10*sizeof(int));
double *pd=malloc(10*sizeof(double));
E. C語言指針變數定義
根據你的定義,使用LinkList定義的變數是指針變數,而加上*即LinkList *C表示的是指向指針的指針,表示二級指針變數。
你的合並函數是一個沒有返回值的函數,所以你在函數體內更改C要達到更改實參的效果,你必須傳入實參的地址。
如果是一級指針,C接收實參指向的對象地址,如果此時在函數體內對C進行賦值,只是改變了函數體內C的指向,實參還是指向原來的地址。函數內是改變不了實參C本身的指向,只有傳入實參C變數本身的地址,那麼形參就要定義指向指針的變數來接收實參。
以上是一種方法,另外一種方法就是通過函數返回值,返回新合並的鏈表的頭。那函數類型就可以改為:
LinkList MergeList(LinkList a, LinkList b)。
這可以多練習好好理解一下。
F. C語言中如何定義一個行指針
int *arry[10]; //指針數組
int (*arryp)[10]; //數組指針,因為數組指針指向數組,而數組也可看做是個指針,那數組指針可以理解為一個二 級指針
int a[10];
arryp = &a; //將數組地址個數組指針
arry[0] = *arryp; //arry[0]是一級指針,要將數組指針賦給指針數組,就要取內容,實際就是 arry[0] = a;
G. c語言結構體指針如何定義和使用
struct stu
{
char name[20];
long number;
float score[4];
} ;
再定義指向結構體類型變數的指針變數:
struct stu *p1, *p2 ;
定義指針變數p 1、p 2,分別指向結構體類型變數。引用形式為:指針變數→成員;
H. C語言函數指針,敲黑白,講重點,如何定義函數指針
學習了數組之後,我們知道數組是在內存中申請一塊內存空間;數組名代表內存塊的首地址,通過數組名可以訪問內存塊中的數據。
那麼,對於函數,它也是存放在內存塊中的一段數據。例如下面的函數:
void func( int a )
{
printf( "in func, a = %d " , a );
}
此時,定義了一個函數名是func的函數。可以如下調用該函數:
func(100);
此時,就進入了func函數的函數體中執行。可以看到, 函數名如同數組名一樣,代表函數所在內存塊的首地址 。通過數組名可以訪問數組在內存塊中申請的內存,同理,通過函數名,可以訪問函數在內存中存放的數據。
所以,函數名就代表了該函數在內存塊中存放的首地址。那麼,函數名是表示一個地址,就可以把這個地址值存放在某一個指針變數中,然後,通過指針變數訪問函數名指向的函數。
在C語言中,提供了函數指針變數,可以存放函數名表示的地址。函數指針變數的定義格式如下:
返回數據類型 (*函數指針變數名)(形參列表)
對比函數的定義如下:
返回數據類型 函數名(形參列表)
可以看到,函數指針變數的定義,與函數的定義格式基本一樣,唯一的區別是把「函數名」轉換為「*(函數指針變數名)」;總結如下:
(1) 使用指針降級運算符*來定義,表示這個是一個指針。
(2) 指針降級運算符*不可以靠近返回數據類型,例如「返回數據類*」就表示函數的返回類型是一個指針。那麼,為了讓指針降級運算符*能夠修飾函數指針變數,就用小括弧()把指針降級運算符*與函數指針變數名包含起來。
定義了函數指針變數之後,可以把函數名賦給函數指針變數。因為,函數名就表示函數在內存塊中的首地址,所以,可以直接把一個地址賦值給函數指針變數。格式如下:
函數指針變數 = 函數名;
最終,可以通過函數指針變數調用函數,調用的格式與通過函數名調用完全一樣,通過函數指針變數調用函數,有如下形式:
方法1:函數指針變數(實參列表);
方法2:(*函數指針變數名)(實參列表);
很多情況下,我們更傾向於使用第一種形式,因為,它的使用方式更接近於通過函數名調用函數。
下面根據程序測試例子來看看怎麼樣應用函數指針變數。
深入學習,可以交個朋友,工人人人號:韋凱峰linux編程學堂
程序運行結果如下:
深入學習,可以交個朋友,工人人人號:韋凱峰linux編程學堂
可以看到,我們定義了func函數和函數指針變數pfunc,然後,把函數名func設置給函數指針變數pfunc,最終,通過函數指針變數pfunc調用函數。
因為函數指針變數存放的就是函數名表示的地址,所以,函數指針變數與函數名一樣,可以直接通過函數指針變數調用函數。
注意:我們在學習指針的時候,可以把一個int類型的變數地址賦值給int類型的指針;但是,不可以把int類型變數的地址,賦值給double類型的指針。這就是變數數據類型不一致的問題。
同樣的道理,定義函數的時候,函數的返回數據類型和形參列表都不一樣,所以,函數指針變數能夠接收的函數名,它們定義的 函數返回數據類型和形參列表必須一致 ,此時,就如同變數與指針變數類型一致時,才可以把變數的地址賦值給指針變數一樣。
如下是一個測試例子:
深入學習,可以交個朋友,工人人人號:韋凱峰linux編程學堂
程序編譯結果如下:
深入學習,可以交個朋友,工人人人號:韋凱峰linux編程學堂
可以看到,我們把func函數的形參列表修改為double,但是,函數指針變數pfunc定義的形參列表為int類型,此時,函數和函數指針變數的定義格式不一致,所以,不可以把函數名表示的地址設置給函數指針變數。我們來總結一下:
(1) 在Ubuntu系統中,使用GCC編譯,提示warning警告,但是,程序可以編譯通過,可以運行。
(2) 在Windows系統中,使用Visual Studio工具,無法編譯該代碼,提示類型不一致。
(3) 從代碼的嚴謹方面來說,是不可以設置類型不一致的數據。所以,我們應該編寫嚴謹的代碼,函數定義的類型,與函數指針類型不一致的時候,不可以把函數名,賦值給函數指針變數。
函數指針變數的定義很重要,我們需要牢記和理解它們使用的方式。下面多舉幾個例子說明函數指針變數的定義和使用。
int func( void );
int (*pfunc)( void );
pfunc = func;
此時,定義func函數,它的返回值類型是int類型,形參列表是void,那麼,定義pfunc函數指針變數的時候,它的返回值類型與形參列表都必須與func一樣。
char * func1( int x, int y, int x);
char * (*pfunc1)( int , int , int );
pfunc1 = func1;
char * (*pfunc1)( int x, int y, int x);
我們再總結一下:
(1) 函數名表示函數在內存塊中的首地址,可以直接把函數名賦值給函數指針變數;
(2) 定義函數指針變數的時候,函數返回數據類型和形參列表必須與要指向函數的定義一致;
I. C語言指針基本概念及其指針變數的定義是什麼
指針是常見間接訪問方式.指針就像一個快捷方式,它指向內存的一個地址,可以通過指針就可以間接的訪問到數據。對於計算機,訪問內存的方式有兩種,直接訪問和間接訪問。直接訪問通過就是通過變數名稱去訪問。指針概念是構成C/C++的重要元素之一,是變數的一種類型,存放的是指定類型數據的地址,而同類型變數存放的是數據。
指針變數:就是一個變數,其值是可變的,與整形變數、浮點變數等等的命名規則完全相同。 「指針」是概念,「指針變數」是具體實現。指針類型說明,即定義變數為一個指針變數; 指針變數名; 變數值(指針)所指向的變數的數據類型。
(9)c語言怎麼定義指針擴展閱讀:
與其他高級編程語言相比,C 語言可以更高效地對計算機硬體進行操作,而計算機硬體的操作指令,在很大程度上依賴於地址。指針提供了對地址操作的一種方法,因此,使用指針可使得 C 語言能夠更高效地實現對計算機底層硬體的操作。另外,通過指針可以更便捷地操作數組。在一定意義上可以說,指針是 C 語言的精髓。