丰满少妇女人a毛片视频-酒色成人网-日韩欧美一-日韩精品一区二区av在线观看-成人久久免费-欧美精品一二三四区-国产午夜免费-亚洲男人第一天堂-一区二区三区福利视频-午夜激情影院-av中文天堂在线-免费一区二区-欧美日韩xxx-91区视频-亚洲另类激情专区小说图片-黄色的网站在线观看-香蕉精品在线

高分網(wǎng) > 答案大全 > 其它答案 >

c語言指針的知識點(diǎn)

時間: 炎婷2 其它答案

  C語言指針知識點(diǎn)整理

  1、指針的初始化

  指針初始化時,“=”的右操作數(shù)必須為內(nèi)存中數(shù)據(jù)的地址,不可以是變量,也不可以直接用整型地址值(但是int*p=0;除外,該語句表示指針為空)。此時,*p只是表示定義的是個指針變量,并沒有間接取值的意思。

  例如:

  int a = 25;

  int *ptr = &a;

  int b[10];

  int *point = b;

  int *p = &b[0];

  如果:int *p;

  *p = 7;

  則編譯器(vs2008)會提示The variable 'p' is being used without being initialized.即使用了未初始化的變量p。

  因?yàn)閜是指向7所在的地址,*p = 7給p所指向的內(nèi)存賦值,p沒有賦值,所以p所指向的內(nèi)存位置是隨機(jī)的,沒有初始化的。

  int k;

  int *p;

  p = &k; //給p賦值

  *p = 7; //給p所指向的內(nèi)存賦值,即k= 7

  2、指針的賦值

  int *p;

  int a;

  int b[1];

  p = &a;

  p = b;

  指針的賦值,“=”的左操作數(shù)可以是*p,也可以是p。

  當(dāng)“=”的左操作數(shù)是*p時,改變的是p所指向的地址存放的數(shù)據(jù);

  當(dāng)“=”的左操作數(shù)是p時,改變的是p所指向的地址。

  數(shù)組的變量名b表示該數(shù)組的首地址,因此p=b;也是正確的

  同類型的指針賦值:

  int val1 = 18,val2 = 19;

  int *p1,*p2;

  p1 = &val1;

  p2 = &val2;

  p1 = p2; //注意啦,p1指向了val2,而沒有指向val1

  備注:字符串與指針的初始化和賦值

  初始化:

  char *cp = "abcdefg"; //這個初始化過程,是將指針cp指向字符串的首地址,而并不是傳遞字符串的值。因?yàn)椋贑語言里面,沒有整體處理一個字符串的機(jī)制

  賦值:

  cp = "abcdefg";

  *cp=”abcdefg” ;//錯誤!字符串常量傳遞的是它的首地址,不可以通過*cp修改該字符串的值,因?yàn)樵撟址疄槌A浚皇呛唵蔚膶⒅羔樦赶蛟撟址A?/p>

  3、指針常量

  在C語言中沒有一種內(nèi)建(built-in)的方法去表示指針常量,所以當(dāng)我們使用它的時候通常先寫成整型常量的形式,然后再通過強(qiáng)制類型轉(zhuǎn)換把它轉(zhuǎn)換成相應(yīng)的類型,如:int * , double * , char *等。 所以后面所示的做法是不行的: int *p = 0x12345678 ; 正確的方式應(yīng)為:int *p = (int *) 0x12345678; 要注意指針中只能存放地址,不能將一個非0值整型常量表達(dá)式或者其他非地址類型的數(shù)據(jù)賦給一個指針,原因就在此。在大多數(shù)計(jì)算機(jī)中,內(nèi)存地址確實(shí)是以無符號整型數(shù)來表示的,而且多以16進(jìn)制表示,但我們在C語言中不能用整型數(shù)去表示地址,只能用指針常量來表示,因?yàn)樗潜挥脕碣x給一個指針的。

  對于這個賦值問題還可以換一個角度去理解,在C語言中,使用賦值操作符時,賦值操作符左邊和右邊的表達(dá)式類型應(yīng)該是相同的,如果不是,賦值操作符將試圖把右邊表達(dá)式的值轉(zhuǎn)換為左邊的類型。所以如果寫出int *p = 0x12345678 ; 這條語句編譯器會報(bào)錯:'=' : cannot convert from ' const int ' to ' int * ' ,因?yàn)橘x值操作符左邊和右邊的表達(dá)式的類型應(yīng)該相同,而0x12345678是int型常量,p是一個指向int型的指針,兩者類型不同,所以正確的方式是:int *p = (int *) 0x12345678 ;

  4、指針初始化補(bǔ)充

  ANSI C定義了零指針常量的概念:一個具有0值的整形常量表達(dá)式,或者此類表達(dá)式被強(qiáng)制轉(zhuǎn)換為void *類型,則稱為空指針常量,它可以用來初始化或賦給任何類型的指針。也就是說,我們可以將0、0L、'/0'、2–2、0*5以及(void *)0賦給一個任何類型的指針,此后這個指針就成為一個空指針,由系統(tǒng)保證空指針不指向任何對象或函數(shù)。

  ANSI C還定義了一個宏NULL,用來表示空指針常量。大多數(shù)C語言的實(shí)現(xiàn)中NULL是采用后面這種方式定義的:#define NULL ((void *)0)。

  對指針進(jìn)行初始化時常用的有以下幾種方式:

  1.采用NULL或空指針常量,如:int *p = NULL;或 char *p = 2-2; 或float *p = 0;

  2.取一個對象的地址然后賦給一個指針,如:int i = 3; int *ip = &i;

  3.將一個指針常量賦給一個指針,如:long *p = (long *)0xfffffff0;

  4.將一個T類型數(shù)組的名字賦給一個相同類型的指針,如:char ary[100]; char *cp = ary;

  5.將一個指針的地址賦給一個指針,如:int i = 3; int *ip = &i;int **pp = &ip;

  6.將一個字符串常量賦給一個字符指針,如:char *cp = “abcdefg”;

  對指針進(jìn)行初始化或賦值的實(shí)質(zhì)是將一個地址或同類型(或相兼容的類型)的指針賦給它,而不管這個地址是怎么取得的。要注意的是:對于一個不確定要指向何種類型的指針,在定義它之后最好把它初始化為NULL,并在解引用這個指針時對它進(jìn)行檢驗(yàn),防止解引用空指針。另外,為程序中任何新創(chuàng)建的變量提供一個合法的初始值是一個好習(xí)慣,它可以幫你避免一些不必要的麻煩。

  5、void *型指針

  ANSI C定義了一種void *型指針,表示定義一個指針,但不指定它指向何種類型的數(shù)據(jù)。void *型指針作為一種通用的指針,可以和其它任何類型的指針(函數(shù)指針除外)相互轉(zhuǎn)化而不需要類型強(qiáng)制轉(zhuǎn)換,但不能對它進(jìn)行解引用及下標(biāo)操作。C語言中的malloc函數(shù)的返回值就是一個void *型指針,我們可以把它直接賦給一個其他類型的指針,但從安全的編程風(fēng)格角度以及兼容性上講,最好還是將返回的指針強(qiáng)制轉(zhuǎn)換為所需的類型,另外,malloc在無法滿足請求時會通過返回一個空指針來作為“內(nèi)存分配失敗”的信號,所以要注意返回值指針的判空。

  6、指向指針的指針

  在指針初始化的第5種方式中提到了用一個指針的地址來初始化一個指針?;貞浺幌律弦恢v的內(nèi)容:指針是一種變量,它也有自己的地址,所以它本身也是可用指針指向的對象。我們可以將指針的地址存放在另一個指針中,如:

  int i = 5000;

  int *pi = &i;

  int **ppi = π

  i的地址為108,pi的內(nèi)容就是i的地址,而pi的地址為104,ppi的內(nèi)容即是pi的地址。對ppi解引用照常會得到ppi所指的對象,所獲得的對象是指向int型變量的指針pi。想要真正地訪問到i.,必須對ppi進(jìn)行兩次解引用,如下面代碼所示:

  printf("%d", i );

  printf("%d", *pi );

  printf("%d", **ppi );

  以上三條語句的輸出均為5000。

  看了“c語言指針的知識點(diǎn)”的還看了:

1.c語言指針的用法

2.c語言實(shí)驗(yàn)報(bào)告范文

3.c語言程序設(shè)計(jì)心得3篇

4.c語言實(shí)訓(xùn)心得體會

5.C語言見習(xí)報(bào)告6篇

50249 阳新县| 湖南省| 平南县| 永丰县| 洪雅县| 汉中市| 搜索| 屏南县| 中山市| 洛隆县| 静海县| 汽车| 麻城市| 孟村| 石景山区| 正镶白旗| 鹤岗市| 清新县| 合山市| 游戏| 五家渠市| 开远市| 原阳县| 和龙市| 泗阳县| 韶山市| 滦平县| 内乡县| 长沙市| 南充市| 区。| 阿拉善左旗| 井研县| 寻乌县| 福泉市| 高淳县| 长白| 启东市| 甘洛县| 来安县| 盖州市|