當前位置:學者齋 >

計算機 >C語言 >

C語言的二級指標是什麼

C語言的二級指標是什麼

指標是C語言中廣泛使用的一種資料型別。 運用指標程式設計是C語言最主要的風格之一。利用指標變數可以表示各種資料結構; 能很方便地使用陣列和字串; 並能象組合語言一樣處理記憶體地址,從而編出精練而高效的程式。指標極大地豐富了C語言的功能。下面是相關的知識,歡迎閱讀。

C語言的二級指標是什麼
  二級指標的概念

首先任何值都有地址,一級指標的值雖然是地址,但這個地址做為一個值亦需要空間來存放,是空間就具有地址,這就是存放地址這一值的空間所具有的地址,二級指標就是為了獲取這個地址,一級指標所關聯的是其值(一個地址)名下空間裡的資料,這個資料可以是任意型別並做任意用途,但二級指標所關聯的資料只有一個型別一個用途,就是地址,指標就是兩個用途提供目標的讀取或改寫,那麼二級指標就是為了提供對於記憶體地址的讀取或改寫指標的表現形式是地址,核心是指向關係指標運算子“*”的作用是按照指向關係訪問所指向的物件.如果存在A指向B的指向關係,則A是B的地址,“*A”表示通過這個指向關係間接訪問B.如果B的值也是一個指標,它指向C,則B是C的地址,“*B”表示間接訪問C如果C是整型、實型或者結構體等型別的變數或者是存放這些型別的資料的陣列元素,則B(即C的地址)是普通的指標,稱為一級指標,用於存放一級指標的變數稱為一級指標變數。A(即B的地址)是指向指標的指標,稱為二級指標,用於存放二級指標的變數稱為二級指標變數.根據B的不同情況,二級指標又分為指向指標變數的.指標和指向陣列的指標

  二級指標的分類

  指向指標變數的指標

在如上的A指向B、B指向C的指向關係中,如果A、B、C都是變數,即C是普通變數,B是一級指標變數,其中存放著C的地址,A是二級指標變數,其中存放著B的地址,則這3個變數分別在記憶體中佔據各自的儲存單元,它們之間的相互關係下圖所示,相互之間的前後位置關係並不重要.此時,B是一級指標變數,B的值(即C的地址)是一級指標資料;A是二級指標變數,A的值(即B的地址)是二級指標資料.

  指向陣列的指標

在C語言中,陣列與其它變數在使用上有很大的不同.無論是字元型、整型、實型變數,還是結構體型別或者指標型別的變數,語句中出現變數名都代表對該變數所在記憶體單元的訪問,變數名代表整個變數在記憶體中的儲存單元,可以向該變數賦值,也可以從中取出資料使用.但是定義一個數組之後,陣列名並不代表整個陣列所佔據的記憶體單元,而是代表陣列首元素的地址.

  二級指標例子:

程式碼如下:

int *q; //定義一個一級指標變數,它指向一個普通變數(即它存的是一個變數的地址)

int **p; //定義一個二級指標變數,它指向一個指標變數(它存的也是一個變數地址,只不過是一個指標變數的地址)

int s;

q = &s; //q中存的是整型變數s的地址,所以q是一級指標

p = &q; //p中存的是一級指標q的地址,所以p是二級指標

例子:

程式碼如下:

# include

void f(int ** q);

int main(void)

{

int i = 9;

int * p = &i;// int *p; p = &i;

printf("%p", p);

f(&p);

printf("%p", p);

return 0;

}

void f(int ** q)

{

*q = (int *)0xFFFFFFFF;// 這裡是更改了p的值,與i無關,p不再指向i

}

1、二級指標的相關問題

程式碼如下:

#include "iostream"

#include "string"

#include "cmath"

using namespace std;

int main()

{

char ch='a';

char *p1=&ch;

char **p=&p1;

cout<<ch<<endl;< p="">

cout<<p1<<endl;< p="">

cout<<&ch<<endl;< p="">

cout<<*p1<<endl;< p="">

cout<<p<<endl;< p="">

cout<<**p<<endl;< p="">

char *p3=NULL;

//cout<<p3<<endl;< p="">

//cout<<*p3<<endl;< p="">

char **p4=&p3;

cout<<p4<<endl;< p="">

//cout<<*p4<<endl;< p="">

cout<<**p4<<endl;< p="">

}

思考上面的輸出是什麼?

2、如下程式,輸出是什麼?

程式碼如下:

#include "iostream"

using namespace std;

int main()

{

int a=12;

int *p=&a;

int **p1=&p;

cout<<a<<endl;< p="">

cout<<&a<<endl;< p="">

cout<<p<<endl;< p="">

cout<<*p<<endl;< p="">

cout<<p1<<endl;< p="">

cout<<*p1<<endl;< p="">

cout<<**p1<<endl;< p="">

}

3、如下程式的輸出是什麼?

#include "iostream"

using namespace std;

int main()

{

int *p=NULL;

int **p1=&p;

cout<<p<<endl;< p="">

//cout<<*p<<endl;< p="">

cout<<p1<<endl;< p="">

cout<<*p1<<endl;< p="">

cout<<**p1<<endl;< p="">

}

void GetMM(char **p,int n){

if(*p!=NULL)

*p=(char*)malloc(n);

(*p)[1]='a';

}

int main()

{

char *str=NULL;

GetMM(&str,10);

}

#include "iostream"

using namespace std;

union A{

int b;

char ch[2];

};

int main()

{

A a;

[0]=0x38;

[1]=0x39;

printf("%x",a.b);//3938

}

標籤: 指標 二級 語言
  • 文章版權屬於文章作者所有,轉載請註明 https://xuezhezhai.com/zh-tw/jsj/cyuyan/1v99km.html