现在的位置: 首页 > 综合 > 正文

Expert C Programming读书笔记IV

2017年12月15日 ⁄ 综合 ⁄ 共 1119字 ⁄ 字号 评论关闭
文章目录

Chapter 4 Arrays are not Pointers!

下列声明
extern int* p;
extern int q[];
有着不同的意思。前者声明了一个指向int的指针,后者定义了一个大小未定的数组,这个数组存放位置在另外的地方。、

Declaration and Definition
声明(Declaration)是指:指定变量的类型,用来“引用”不在本地的实际的变量
定义(Definition)是指:指定变量的类型,**并且为变量分配内存空间**,从而创建新的变量。

L-Value and R-Value
x=y, x-->L-Value while y-->R-Value
左值(L-Value)是指编译时就求得的量,事实上代表x存放的地址,用于存放y的的内容。
右值(R-Value)是指运行时求得的量,往往代表y的具体数值。

附注:有了左值右值的概念,就可以容易的理解C++语言中重载问题:
template <typename T>
class vector
{
    public:
        T& operator[](const index_type index);
        const T& operator[](const index_type index) const;
};
因为左值是地址,这样当进行vector.operator[](xxx)=???的时候就能从T&和const T&中分辨出来左值和右值,进而进行不同的处理。

数组和指针的引用方式
数组是在编译时期就确定了首地址的变量,因而进行
a[i]
的时候,编译器将直接取得a的地址值,并且加上i*sizeof(typeof(a))的偏移,进而解引用。
而对指针,因为他指向地址的不确定性,所以要先确定指针本身的地址,再找到指向的地址,然后进行解引用。

用[]解引用一般指针
有时候有定义
char* a="abcdefg";
然后直接用a[i]解引用,这时首先找到a所在地址,然后求出a指向的地址,最后加上i*sizeof(typeof(char))的偏移。

声明与定义相匹配
对于数组声明和定义匹配:
extern int mango[]; // declaration
int mango[100]; // definition, allocate memory either on dseg or sseg
而指针:
extern int* raisin; // declaration
int* raisin; // definition

数组和指针的区别
数组:1.保存数据 2.直接访问数据,不经换算 3.用于储存给定长度的数据 4.自动分配释放资源 5.符号表上有记号
指针:1.保存地址 2.间接访问数据,需要换算 3.动态分配内存时使用 4.需要手工分配回收资源 5.常用于引用匿名数据

 

抱歉!评论已关闭.