歡迎使用我的 在線工具

          小D

          讀歷史、看小說、寫程序都是我所愛。技術(shù)不好,頭腦不靈光,靠的是興趣。
          隨筆 - 35, 文章 - 25, 評論 - 13, 引用 - 0
          數(shù)據(jù)加載中……

          關(guān)于指針

          #include <iostream.h>
          #include <string.h>
          void main()
          {
          /* test 1?
          ?const int c_ival = 0;
          ?int *pi;
          ?pi = c_ival;//指針變量可以通過一個(gè)常量賦值
          ?int ival = 2;//指針變量不可以通過一個(gè)變量賦值
          ?//pi = 2; //任何字面量,除0外,都不可以給指針變量賦值
          ?pi = 0; //指針只能通過字面值0或者const量0,以及NULL預(yù)定義變量賦值
          ?pi = NULL;//NULL是一個(gè)預(yù)處理變量,也可以為指針變量賦值。
          */

          /* test 2
          ?double dval;
          ?double *pd = &dval;//可通過變量的地址(指針)給指針變量賦值
          ?double *pd2 = pd; //同類型的指針變量可以賦值
          //?int *pi = pd;?? //不同類型的當(dāng)然不能復(fù)制了
          //?int *pi = &dval; //類型不同的變量的指針不能互相賦值
          */

          /* test 3
          ?double obj = 3.14;
          ?double *pd = &obj;//OK,不多說
          ?void *pv = &obj;
          ?pv = pd;
          ?int *pi;
          ?//pi = &2;//不能對常量取地址。
          ?int iv = 11;
          ?pi = &iv;
          ?pv = pi;//類型相同的變量才可以賦值,而且void*型指針可以保持任何對象的地址
          ?//void*指針只能用于比較,傳參,不可以操作其指向的對象
          */

          ?/**
          ??友情提供:
          ??指針和引用的比較:
          ??雖然引用(reference)和指針都可以間接訪問另一個(gè)值,但它們之間有兩個(gè)主要的區(qū)別。
          ??第一個(gè)區(qū)別在于引用總是指向某個(gè)對象:定義引用時(shí)沒有初始化是錯(cuò)誤的。第二個(gè)重要
          ??的區(qū)別則是賦值行為的差異:給引用賦值修改的是該引用所關(guān)聯(lián)的對象的值,而并不是
          ??使引用與另一個(gè)對象關(guān)聯(lián)。應(yīng)用一經(jīng)初始化,就始終指向同一個(gè)特定的對象。
          ?*/

          /* test 4
          ?int ival = 1024, ival2 = 2048;
          ?int *pi = &ival, *pi2 = &ival2;
          ?pi = pi2;
          //正確
          ?int &ri = ival, &ri2 = ival2;
          ?ri = ri2;
          ?cout<<"ri = "<<ri<<", ri2 = "<<ri2<<endl;
          ?//output :ri = 2048, ri2 = 2048
          ?//注意這里并沒有改變r(jià)i與ri2的指向,而是改變他們所各自關(guān)聯(lián)的對象的值。
          */

          /* test 5
          ?int ival = 1024;
          ?int *pi = &ival;
          ?int **ppi = &pi; //C++使用**操作符指派一個(gè)指針指向另一個(gè)指針。**也是指向符。
          ?//下面相同的值,相同的對象
          ?cout<<ival<<" "<<*pi<<" "<<**ppi<<endl;
          */

          //忍不住了,討論下,const引用
          ?//正解:const引用是指向const對象的引用。
          ?//const int ival = 1024;?//引用必須初始化
          ?//const int &refVal = ival;
          ?//int &ref2 = ival;//非常量對象的引用不可以指向常量對象的引用

          //?const int &refVal2 = 2;//const引用可以以字面量初始化
          //?int vali = 1111;
          //?const int &refVal3 = vali;//const引用可以以變量初始化,但是通過該引用訪問該變量,就只能當(dāng)做常量使用。
          //?refVal3 = 100; 不可修改,表明這里是該引用指向了一個(gè)常量對象。
          ?//l-value左值,左值是變量,可左可右。 r-value右值,右值是常量(包括字面量),只能右

          ?/*
          ??在指針上加上(或減去)一個(gè)整形數(shù)值n等效于獲得一個(gè)新指針,該新指針指向指針原來指向的元素之后
          ??(或之前)的第n個(gè)元素。
          ??兩個(gè)指針減法操作的結(jié)果是標(biāo)準(zhǔn)庫類型ptrdiff_t的數(shù)據(jù)。這是一個(gè)signed整形,它表示兩個(gè)指針之間
          ??的差距。
          ?*/?????
          /*?test 6
          ?const size_t arr_sz = 5;
          ?int int_arr[arr_sz] = {0, 1, 2, 3, 4};
          ?for(int *pbegin = int_arr, *pend = int_arr + arr_sz;
          ???pbegin != pend; ++pbegin)
          ???{
          ???//?cout<<int_arr[5]; 為什么會(huì)輸出5,詭異啊。
          ????cout<<*pbegin<<' ';
          ???}
          */

          ?//指向const對象的指針和const指針
          ?//指向const對象的指針這樣聲明 const double *cptr;
          ?//1. 不能修改所指對象的值,因?yàn)槭莄onst對象嘛。
          ?//*cptr = 42; //這是錯(cuò)誤的。
          ?//2. 不能使用void*指針保持const對象的地址,而必須使用const void*。
          //?const int universe = 42;
          //?const void *cpv = &universe;
          //?void *pv = &universe; //錯(cuò)誤的,必須使用const void*
          ?//3. 對于非const對象的處理和const引用是一樣的。
          ?//但是我們可以修改指針變量的值,使我們的指針指向新的對象。只是這個(gè)對象無論是否為const
          ?//只要我們通過這個(gè)指針訪問,那么系統(tǒng)都認(rèn)為其為const。(自以為指向const的指針)

          ?//const指針是這樣 double *const cptr;
          ?//指針變量的本身的值無法修改,也就是指針無法執(zhí)行初始指定的對象的值,
          ?//這樣和const引用則比較像了,但是我們可以修改我們所執(zhí)行的對象。

          /*
          ?double dval = 33.33;
          ?double *const cptr = &dval;
          ?*cptr = 332.02;
          ?cout<<dval<<" "<<*cptr;
          ?//下面最變態(tài)的:指向const對象的const指針
          ?const double pi = 3.14159;
          ?const double *const pi_ptr = &pi;
          ?//從右向左讀,關(guān)于指針都一般都這么讀,既不可以修改指針?biāo)赶虻膶ο蟮闹担膊豢梢孕薷脑撝羔樀闹赶颉?br />*/
          /*
          ?//typedef和指針 不多說反正記得typedef不是簡單的文本擴(kuò)展,其實(shí)只要注意const應(yīng)該寫在類型后面就可以了
          ?//所以:
          ?//下面
          ?typedef string *pstring;
          ?const pstring cstr;
          ?//等價(jià)于
          ?string *const cstr;//也就是const指針。
          */

          }

          ?

          再加一點(diǎn),天亮了要睡覺了啊!

          #include <stdio.h>
          #include <iostream.h>
          #include <string.h>
          #include <string>
          using namespace std;
          void main()
          {
          ?const char *cp1 = "A string example";
          ?const char *cp2 = "A different string";
          //?int i = strcmp(cp1, cp2);
          //?printf("%d\n", i);
          //?i = strcmp(cp2, cp1);
          //?printf("%d\n", i);
          //?i = strcmp(cp1, cp1);
          //?printf("%d\n", i);

          //?char largeStr[16 + 18 + 2];
          //?strcpy(largeStr, cp1);
          //?printf("%s\n", largeStr);
          //?strcat(largeStr, " ");
          //?strcat(largeStr, cp2);
          //?printf("%s\n", largeStr);

          //?char ca[] = {'C', '+', '+', '\0'};
          //?cout<<strlen(ca)<<endl; 空格并不是null


          ?int ia[3][4] = {
          ??{0, 1, 2, 3},
          ??{4, 5, 6, 7},
          ??{8, 9, 10, 11},
          ?};

          ?typedef int int_array[4];
          ?int_array *ip = ia;

          ?for(int_array *p = ia; p != ia + 3; ++p)
          ??for(int *q = *p; q != *p + 4; ++q)
          ???cout<< *q <<endl;

          ?//可使用數(shù)組長度后面的一對圓括號,對數(shù)組元素做值初始化:
          ??int *pia2 = new int[10]();
          ?//?這里初始化為0
          ?// 允許定義類類型的const數(shù)組,但該類型必須提供默認(rèn)的構(gòu)造函數(shù)
          ?//?const string *pcs = new const string[100];//似乎不支持, 而且沒有必要,
          ??//因?yàn)閟tring早已做好了相關(guān)的支持。
          ??//這里就會(huì)使用默認(rèn)構(gòu)造函數(shù)來初始化數(shù)組元素
          ??//使用delete [] 數(shù)組名 來釋放數(shù)組空間。
          ??//delete [] pcs;
          ??delete [] pia2;

          }

          ?

          posted on 2009-11-04 19:18 vagasnail 閱讀(256) 評論(0)  編輯  收藏 所屬分類: C\C++

          主站蜘蛛池模板: 海晏县| 宝清县| 青州市| 龙岩市| 当阳市| 桓台县| 原阳县| 延边| 陆丰市| 望奎县| 伽师县| 内乡县| 沙湾县| 芮城县| 万载县| 颍上县| 阳谷县| 松潘县| 怀安县| 河曲县| 疏附县| 嘉峪关市| 抚顺市| 汉沽区| 铁岭市| 八宿县| 六盘水市| 广昌县| 兰溪市| 甘泉县| 大冶市| 库尔勒市| 芒康县| 龙岩市| 丹巴县| 门头沟区| 德昌县| 临潭县| 建平县| 卫辉市| 平江县|