1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問(wèn)題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
      《C和指針》讀書(shū)筆記(第六章指針)-創(chuàng)新互聯(lián)

      有人稱指針是C語(yǔ)言的靈魂,有人又稱指針說(shuō)指針是C語(yǔ)言最難的部分,那么,指針對(duì)C語(yǔ)言來(lái)說(shuō)到底意味著什么?指針到底是不是C語(yǔ)言和C++經(jīng)久不衰的原因之一呢?

      成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供富民企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)H5技術(shù)、小程序制作等業(yè)務(wù)。10年已為富民眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。

      指針的問(wèn)題不是三言兩語(yǔ)就能表達(dá)清楚的,而在《C和指針》第六章中也僅僅是提到了指針有關(guān)的部分內(nèi)容,指針的精彩與巧妙之處,還需要在后續(xù)的章節(jié)和具體的項(xiàng)目代碼中細(xì)細(xì)體會(huì)。先來(lái)看看本章內(nèi)容的基本框架(思維導(dǎo)圖)。

      思維導(dǎo)圖

      在這里插入圖片描述
      從思維導(dǎo)圖里可以看出,關(guān)于指針的內(nèi)容還是比較多的,我們的重點(diǎn)需要放在指針表達(dá)式的理解上。

      6.1 內(nèi)存和地址

      內(nèi)存和地址是一個(gè)很深刻的話題,為了方便地訪問(wèn)計(jì)算機(jī)的內(nèi)存數(shù)據(jù),我們會(huì)對(duì)其進(jìn)行編號(hào),就像現(xiàn)實(shí)中我們郵寄地址的郵政編碼一樣。書(shū)中提到,我們只對(duì)兩件事情感興趣。

      1. 內(nèi)存中的每個(gè)位置有一個(gè)獨(dú)一無(wú)二的地址標(biāo)識(shí)。
      2. 內(nèi)存中的每個(gè)位置都包含一個(gè)值。
      6.2 值和類型

      在現(xiàn)實(shí)中我們需要保存各種各樣的數(shù)值,然而對(duì)于計(jì)算機(jī)的內(nèi)存來(lái)說(shuō),只有01,所以某內(nèi)存中的到底表示什么值,則需要看被解釋為什么值。

      int a = 112, b = -1;
      	float c = 3.14;
      	int *d = &a;
      	float *e = &c;

      然而在內(nèi)存中,確有著如下的數(shù)值。
      在這里插入圖片描述
      所以書(shū)中特別強(qiáng)調(diào):不能簡(jiǎn)單地通過(guò)檢查一個(gè)值的位來(lái)判斷它的類型

      6.3 指針變量的內(nèi)容

      6.2小節(jié)的內(nèi)容可以看出,d和e中存儲(chǔ)的值恰好差8,也就是兩個(gè)int型變量的距離(因?yàn)橐粋€(gè)int型變量一般占4個(gè)字節(jié)),那么變量de的值到底是多少呢?究竟是其本身的值呢?還是其指向內(nèi)存地址內(nèi)所保存的值呢?

      按照規(guī)定,變量的值就是分配給變量的內(nèi)存位置所存儲(chǔ)的數(shù)值,即使是指針變量也不例外。從這個(gè)規(guī)定來(lái)看,變量de的值應(yīng)該分別是100108

      6.4 間接訪問(wèn)操作符

      通過(guò)一個(gè)指針訪問(wèn)它所指向的地址的過(guò)程稱為間接訪問(wèn)或解引用指針。這個(gè)用于執(zhí)行間接訪問(wèn)的操作符是單目操作符*。下面還是通過(guò)以上的一個(gè)變量看看間接訪問(wèn)操作符如何訪問(wèn)所需的數(shù)值。

      int main()
      {int a = 112, b = -1;
      	float c = 3.14;
      	int *d = &a;
      	float *e = &c;
      	printf("a = %d\n", *d);
      	printf("c = %f\n", *e);
      	system("pause");
      }

      我們來(lái)看看打印輸出:
      在這里插入圖片描述
      確實(shí)獲取到了我們需要的數(shù)值。

      6.5 未初始化和非法的指針

      書(shū)中有這樣的例子:

      int *a;
      	*a = 12;

      顯然這樣的表達(dá)是有問(wèn)題的,從程序中來(lái)看,a指向某地址的值為12,但是究竟12位于哪個(gè)地址是未知的,所以可以寫(xiě)成下面的形式。

      int num = 12;
      	int *a = #
      	printf("結(jié)果為:%d\n", *a);
      	system("pause");
      	return 0;

      雖然我們并不能直接知道num究竟保存在什么地方,但是可以通過(guò)指針a間接訪問(wèn)num中存儲(chǔ)的值。

      6.6 NULL指針

      NULL指針相當(dāng)于是指針初始化的一種方式,表示當(dāng)前指針并未指向任何內(nèi)存地址,以為有時(shí)候編程的時(shí)候會(huì)遇到,需要定義一個(gè)指針,但是暫時(shí)并未想好要指向的內(nèi)存地址,這個(gè)時(shí)候NULL指針就有了用武之地。舉個(gè)例子。

      劍指 Offer 50. 第一個(gè)只出現(xiàn)一次的字符
      在字符串 s 中找出第一個(gè)只出現(xiàn)一次的字符。如果沒(méi)有,返回一個(gè)單空格。
      s只包含小寫(xiě)字母。

      typedef struct hash
      {int key;
          int val;
          UT_hash_handle hh;
      }hash;
      char firstUniqChar(char* s) {int len = strlen(s);
          hash *f = NULL;
          for(int i = 0; i< len; i++)
          {int ele = s[i];
              hash *temp = NULL;
              HASH_FIND_INT(f,&ele,temp);
              if(temp == NULL)
              {temp = malloc(sizeof(hash));
                  temp->key = ele;
                  temp->val = 1;
                  HASH_ADD_INT(f,key,temp);
              }
              else
                  temp->val++;
          }
          for(int i = 0; i< len; i++)
          {int ele = s[i];
              hash *temp = NULL;
              HASH_FIND_INT(f,&ele,temp);
              if(temp != NULL && temp->val == 1)
              {return temp->key;
              }
          }
          return ' ';
      }

      創(chuàng)建了一個(gè)哈希表。用來(lái)存放字符數(shù)組s中出現(xiàn)的各個(gè)字母及其出現(xiàn)的頻率,在剛剛定義的時(shí)候,還沒(méi)有開(kāi)始統(tǒng)計(jì),所以不是很好確定到底要指向何處,因此出現(xiàn)了下面的表達(dá)式。

      hash *f = NULL;
      6.7 指針、間接訪問(wèn)和左值

      當(dāng)指針變量作為左值的時(shí)候,會(huì)出現(xiàn)什么樣的情況呢?我們一起來(lái)看看書(shū)上給的例子(有改動(dòng))。

      int a = 4;
      	int *d = &a;
      	*d = 10 - *d;
      	printf("結(jié)果為:%d\n", *d);
      	system("pause");
      	return 0;

      打印輸出如下:
      在這里插入圖片描述
      可以看出在語(yǔ)句*d = 10 - *d中,該語(yǔ)句可以這樣理解:用10減去指針d所指向地址的值,并保存在原地址。

      6.8 指針、間接訪問(wèn)和變量

      書(shū)中提到了這樣的運(yùn)算:*&細(xì)品之下好像并沒(méi)有什么作用,因?yàn)橄冗M(jìn)行了取地址運(yùn)算,再間接訪問(wèn)。舉個(gè)例子:

      int a = 4;
      	*&a = 40;
      	printf("結(jié)果為:%d\n", a);
      	system("pause");
      	return 0;

      打印輸出:
      在這里插入圖片描述
      可以看出,這與直接對(duì)變量a進(jìn)行賦值并沒(méi)有什么不同。

      6.9 指針常量

      關(guān)于指針常量的定義(還有指針常量和常量指針的區(qū)別),我們?cè)诖饲暗恼鹿?jié)中介紹過(guò),具體見(jiàn):

      第3章 數(shù)據(jù)

      書(shū)中介紹了這樣一種情況,如果我們想在指定位置存儲(chǔ)指定的值,應(yīng)該怎么辦呢?比方說(shuō)在地址100的地方存儲(chǔ)25,難道我們直接像下面這樣:

      *100 = 25;

      其實(shí)這是錯(cuò)誤的做法,因?yàn)殚g接訪問(wèn)操作符只能作用于指針,而100是具體的數(shù)值,所以就會(huì)出現(xiàn)問(wèn)題,正確的做法應(yīng)該是下面這樣,使用強(qiáng)制類型轉(zhuǎn)換。

      *(int *)100 = 25;

      雖然書(shū)上是這樣介紹的,但實(shí)際在VS的集成開(kāi)發(fā)環(huán)境中會(huì)報(bào)錯(cuò),可能在其他環(huán)境中不會(huì)報(bào)錯(cuò)。因?yàn)槲覀冎苯泳庉嫷膬?nèi)存地址有可能是系統(tǒng)不允許訪問(wèn)的地址,等等。這個(gè)表達(dá)式必須要知道,因?yàn)楹芏喙镜拿嬖囶}中會(huì)考到。

      6.10 指針的指針

      聽(tīng)起來(lái)有點(diǎn)繞,但是這種操作(思想)在C語(yǔ)言的編程中非常常見(jiàn)。書(shū)上有個(gè)例子:

      int a = 12;
      	int *b = &a;
      	int **c = &b;
      	printf("結(jié)果為:%d\n", **c);
      	system("pause");
      	return 0;

      打印輸出:
      在這里插入圖片描述
      a的地址保存在了b中,然后再將b的地址保存在了c中,這樣的操作看著很無(wú)聊,但是在后面的章節(jié)中就會(huì)發(fā)現(xiàn)其中的奧妙

      6.11 指針表達(dá)式

      這部分內(nèi)容非常非常重要!!!因?yàn)槿际浅R?jiàn)的指針表達(dá)式,這部分內(nèi)容對(duì)理解指針有相當(dāng)大的幫助。
      特別提示:
      所謂的作為左值,可理解為往該變量寫(xiě)入數(shù)值,
      作為的作為右值,可理解為從該變量讀出數(shù)值。
      首先我們對(duì)chcp作了以下聲明:

      char ch = 'a';
      	char *cp = &cp;

      總結(jié)了書(shū)上提到的所有情況,并作了相應(yīng)的解釋(好辛苦啊啊啊啊啊啊啊啊)。
      其中的虛線框表示中間的計(jì)算結(jié)果,實(shí)線框表示得到的結(jié)果或要寫(xiě)入的地址空間。
      在這里插入圖片描述

      6.12 實(shí)例

      書(shū)上給出了一個(gè)求字符串長(zhǎng)度的函數(shù),其實(shí)這個(gè)函數(shù)本身庫(kù)里面也有。

      size_t strlen(char *string)
      {int length = 0;
      	while (*string++ != '\0')
      		length++;
      	return length;
      }
      int main()
      {int res;
      	char a[] = "qwer";
      	res = strlen(a);
      	if (res)
      		printf("The string length is %d",res);
      	else
      		printf("The string length is zero!");
      	system("pause");
      	return 0;
      }

      毫無(wú)疑問(wèn)地,打印輸出如下。
      在這里插入圖片描述
      這個(gè)例子很好理解,直接將字符串作為實(shí)參傳入strlen()函數(shù)中,函數(shù)內(nèi)部進(jìn)行判斷,如果沒(méi)到字符串結(jié)尾,就將長(zhǎng)度值加一,并向后移動(dòng)一個(gè)元素的距離,直到訪問(wèn)完每個(gè)元素,然后返回字符串長(zhǎng)度即可。

      6.13 指針運(yùn)算 6.13.1 算術(shù)運(yùn)算
      1. 指針 ± 整數(shù)
        很顯然,這個(gè)表達(dá)式的含義就是指針往右移動(dòng)N個(gè)連續(xù)的存儲(chǔ)空間,一般只對(duì)數(shù)組有用。
        比方說(shuō)下面這個(gè)例子:
      int main()
      {char ch = 'a';
      	char *cp = &ch;
      	int a[] = {0,1,2,3,4,5,6};
      	int *p = a;
      	printf("%d", *p + 3);
      	system("pause");
      	return 0;
      }

      打印輸出:
      在這里插入圖片描述

      1. 指針 - 指針
        指針的減法肯定很好理解,字面意思就是兩個(gè)指針的距離,事實(shí)上也的確如此,減法運(yùn)算的值是兩個(gè)指針在內(nèi)存中的距離,這里肯定指的也是連續(xù)的存儲(chǔ)空間,一般指的是數(shù)組,否則做減法也沒(méi)有意義。看一個(gè)數(shù)組的例子:
      int main()
      {char ch = 'a';
      	char *cp = &ch;
      	int a[] = {0,1,2,3,4,5,6};
      	int *p1 = &a[0];
      	int *p2 = &a[3];
      	printf("%d", p2 - p1);
      	system("pause");
      	return 0;
      }

      打印輸出:
      在這里插入圖片描述

      6.13.2 關(guān)系運(yùn)算

      指針之間也可以進(jìn)行部分關(guān)系運(yùn)算,可以執(zhí)行的關(guān)系運(yùn)算有<<=>>=
      舉個(gè)例子:

      int main()
      {char ch = 'a';
      	char *cp = &ch;
      	int a[] = {0,1,2,3,4,5,6};
      	int *vp = NULL;
      	for(vp = &a[0]; vp<= &a[6]; vp++)
      		printf("%d\n", *vp);
      	system("pause");
      	return 0;
      }

      打印輸出如下:
      在這里插入圖片描述
      其實(shí)這里的指針充當(dāng)了迭代器的角色,將數(shù)組中的數(shù)值一個(gè)個(gè)地取出來(lái)。

      ---------------------------------------------------------------------------------END------------------------------------------------------------------------------

      你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧


      網(wǎng)頁(yè)名稱:《C和指針》讀書(shū)筆記(第六章指針)-創(chuàng)新互聯(lián)
      文章分享:http://www.ef60e0e.cn/article/doepgs.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        汽车| 巴南区| 鲁山县| 永寿县| 农安县| 黄石市| 河源市| 琼海市| 嘉兴市| 惠水县| 泗水县| 旬阳县| 台东市| 潼南县| 水富县| 双柏县| 清新县| 金寨县| 霍林郭勒市| 丰城市| 新干县| 衢州市| 成安县| 东兰县| 阿拉尔市| 顺平县| 邹平县| 邯郸县| 子长县| 滦平县| 伊金霍洛旗| 万盛区| 垫江县| 阳泉市| 大安市| 堆龙德庆县| 临海市| 小金县| 新巴尔虎右旗| 浑源县| 太和县|