#include <iostream.h>
#include <string.h>
void main()
{
/* test 1?
?const int c_ival = 0;
?int *pi;
?pi = c_ival;//指針變量可以通過(guò)一個(gè)常量賦值
?int ival = 2;//指針變量不可以通過(guò)一個(gè)變量賦值
?//pi = 2; //任何字面量,除0外,都不可以給指針變量賦值
?pi = 0; //指針只能通過(guò)字面值0或者const量0,以及NULL預(yù)定義變量賦值
?pi = NULL;//NULL是一個(gè)預(yù)處理變量,也可以為指針變量賦值。
*/
/* test 2
?double dval;
?double *pd = &dval;//可通過(guò)變量的地址(指針)給指針變量賦值
?double *pd2 = pd; //同類型的指針變量可以賦值
//?int *pi = pd;?? //不同類型的當(dāng)然不能復(fù)制了
//?int *pi = &dval; //類型不同的變量的指針不能互相賦值
*/
/* test 3
?double obj = 3.14;
?double *pd = &obj;//OK,不多說(shuō)
?void *pv = &obj;
?pv = pd;
?int *pi;
?//pi = &2;//不能對(duì)常量取地址。
?int iv = 11;
?pi = &iv;
?pv = pi;//類型相同的變量才可以賦值,而且void*型指針可以保持任何對(duì)象的地址
?//void*指針只能用于比較,傳參,不可以操作其指向的對(duì)象
*/
?/**
??友情提供:
??指針和引用的比較:
??雖然引用(reference)和指針都可以間接訪問(wèn)另一個(gè)值,但它們之間有兩個(gè)主要的區(qū)別。
??第一個(gè)區(qū)別在于引用總是指向某個(gè)對(duì)象:定義引用時(shí)沒(méi)有初始化是錯(cuò)誤的。第二個(gè)重要
??的區(qū)別則是賦值行為的差異:給引用賦值修改的是該引用所關(guān)聯(lián)的對(duì)象的值,而并不是
??使引用與另一個(gè)對(duì)象關(guān)聯(lián)。應(yīng)用一經(jīng)初始化,就始終指向同一個(gè)特定的對(duì)象。
?*/
/* 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
?//注意這里并沒(méi)有改變r(jià)i與ri2的指向,而是改變他們所各自關(guān)聯(lián)的對(duì)象的值。
*/
/* test 5
?int ival = 1024;
?int *pi = &ival;
?int **ppi = π //C++使用**操作符指派一個(gè)指針指向另一個(gè)指針。**也是指向符。
?//下面相同的值,相同的對(duì)象
?cout<<ival<<" "<<*pi<<" "<<**ppi<<endl;
*/
//忍不住了,討論下,const引用
?//正解:const引用是指向const對(duì)象的引用。
?//const int ival = 1024;?//引用必須初始化
?//const int &refVal = ival;
?//int &ref2 = ival;//非常量對(duì)象的引用不可以指向常量對(duì)象的引用
//?const int &refVal2 = 2;//const引用可以以字面量初始化
//?int vali = 1111;
//?const int &refVal3 = vali;//const引用可以以變量初始化,但是通過(guò)該引用訪問(wèn)該變量,就只能當(dāng)做常量使用。
//?refVal3 = 100; 不可修改,表明這里是該引用指向了一個(gè)常量對(duì)象。
?//l-value左值,左值是變量,可左可右。 r-value右值,右值是常量(包括字面量),只能右
?/*
??在指針上加上(或減去)一個(gè)整形數(shù)值n等效于獲得一個(gè)新指針,該新指針指向指針原來(lái)指向的元素之后
??(或之前)的第n個(gè)元素。
??兩個(gè)指針減法操作的結(jié)果是標(biāo)準(zhǔn)庫(kù)類型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對(duì)象的指針和const指針
?//指向const對(duì)象的指針這樣聲明 const double *cptr;
?//1. 不能修改所指對(duì)象的值,因?yàn)槭莄onst對(duì)象嘛。
?//*cptr = 42; //這是錯(cuò)誤的。
?//2. 不能使用void*指針保持const對(duì)象的地址,而必須使用const void*。
//?const int universe = 42;
//?const void *cpv = &universe;
//?void *pv = &universe; //錯(cuò)誤的,必須使用const void*
?//3. 對(duì)于非const對(duì)象的處理和const引用是一樣的。
?//但是我們可以修改指針變量的值,使我們的指針指向新的對(duì)象。只是這個(gè)對(duì)象無(wú)論是否為const
?//只要我們通過(guò)這個(gè)指針訪問(wèn),那么系統(tǒng)都認(rèn)為其為const。(自以為指向const的指針)
?//const指針是這樣 double *const cptr;
?//指針變量的本身的值無(wú)法修改,也就是指針無(wú)法執(zhí)行初始指定的對(duì)象的值,
?//這樣和const引用則比較像了,但是我們可以修改我們所執(zhí)行的對(duì)象。
/*
?double dval = 33.33;
?double *const cptr = &dval;
?*cptr = 332.02;
?cout<<dval<<" "<<*cptr;
?//下面最變態(tài)的:指向const對(duì)象的const指針
?const double pi = 3.14159;
?const double *const pi_ptr = π
?//從右向左讀,關(guān)于指針都一般都這么讀,既不可以修改指針?biāo)赶虻膶?duì)象的值,也不可以修改該指針的指向。
*/
/*
?//typedef和指針 不多說(shuō)反正記得typedef不是簡(jiǎn)單的文本擴(kuò)展,其實(shí)只要注意const應(yīng)該寫(xiě)在類型后面就可以了
?//所以:
?//下面
?typedef string *pstring;
?const pstring cstr;
?//等價(jià)于
?string *const cstr;//也就是const指針。
*/
}
?
再加一點(diǎn),天亮了要睡覺(jué)了??!
#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ù)組長(zhǎng)度后面的一對(duì)圓括號(hào),對(duì)數(shù)組元素做值初始化:
??int *pia2 = new int[10]();
?//?這里初始化為0
?// 允許定義類類型的const數(shù)組,但該類型必須提供默認(rèn)的構(gòu)造函數(shù)
?//?const string *pcs = new const string[100];//似乎不支持, 而且沒(méi)有必要,
??//因?yàn)閟tring早已做好了相關(guān)的支持。
??//這里就會(huì)使用默認(rèn)構(gòu)造函數(shù)來(lái)初始化數(shù)組元素
??//使用delete [] 數(shù)組名 來(lái)釋放數(shù)組空間。
??//delete [] pcs;
??delete [] pia2;
}
?