lecture8一C指针 绳伟光 上海交通大学微纳电子学系 2017年03月21日 SHAN
lecture 8 —— C指针 绳伟光 上海交通大学微纳电子学系 2017年03月21日
内容 ■指针 ■指针与数组 ■*缓冲区溢出 2
指针 指针与数组 *缓冲区溢出 内容 2
指针(Pointers)变量 理解指针的第一步是理解数据在冯诺依曼计算 机上的存储模式 ■在现代计算机中,数据集中存储在RAM中, RAM各个单元的访问是通过地址(Address)进行 的 目前主要的RAM编址方式是按照字节编址,给 定存储器一个地址,存储器访问与此地址对应 的RAM单元
指针(Pointers)变量 理解指针的第一步是理解数据在冯诺依曼计算 机上的存储模式 在现代计算机中,数据集中存储在RAM中, RAM各个单元的访问是通过地址(Address)进行 的 目前主要的RAM编址方式是按照字节编址,给 定存储器一个地址,存储器访问与此地址对应 的RAM单元 3
内存编址 假设RAM的容量为n Bytes,则可以认为地址的 范围从0到n-1: Address Contents 0 01010011 1 01110101 2 01110011 3 01100001 4 01101110 n-1 01000011 4
内存编址 假设RAM的容量为n Bytes,则可以认为地址的 范围从0到n – 1: 4
变量与内存 程序中的每个变量会占据内存中的一个或多个 字节,首字节的地址被视为该变量的地址 ■下图中变量1的地址为2000: 2000 2001 5
变量与内存 程序中的每个变量会占据内存中的一个或多个 字节,首字节的地址被视为该变量的地址 下图中变量i的地址为2000: 5
指针与地址(结合汇编进行讲解) ■内存地址本身可以存储在称为指针变量 (pointer variables)的对象中 当我们将变量1的地址存储在指针变量p中时, 我们说指针p指向(points to)i,图示如下: i ■注:p存储的是地址,1存储的是真实数据
指针与地址(结合汇编进行讲解) 内存地址本身可以存储在称为指针变量 (pointer variables)的对象中 当我们将变量i的地址存储在指针变量p中时, 我们说指针p指向(points to)i,图示如下: 注:p存储的是地址,i存储的是真实数据 6
指针变量声明 指针变量声明和普通变量类似,区别在于在指针名字 前面加上一个星号: int *p; ■p是一个指针变量,指向内存中int型的对象 ■ 之所以用对象这个称谓,是因为不单可以指向内存 中的变量,还可以指向内存中的其它非变量的部分 注:指针的声明中,星号是附着在指针变量上面的, 而不是类型后面,故此当和普通变量一起声明时要注 意星号的位置: inti,j,a[1g],b[20],*p,*q;
指针变量声明 指针变量声明和普通变量类似,区别在于在指针名字 前面加上一个星号: int *p; p是一个指针变量,指向内存中int型的对象 之所以用对象这个称谓,是因为p不单可以指向内存 中的变量,还可以指向内存中的其它非变量的部分 注:指针的声明中,星号是附着在指针变量上面的, 而不是类型后面,故此当和普通变量一起声明时要注 意星号的位置: int i, j, a[10], b[20], *p, *q; 7
指针的被引用类型(Referenced Type) C要求所有指针都要指向某种特定类型的对象,该特定类 型称为被引用类型(referenced type): int *p) /points only to integers double *q; /points only to doubles char *r; /points only to characters 被引用类型具体为哪种类型没有限制 声明一个指针只是为指针变量本身分配了空间,并没有 为其指向的对象分配空间,也没有让其指向某个对象 int *p;/points nowhere in particular 指针具体使用时应该用地址值初始化
指针的被引用类型(Referenced Type) C要求所有指针都要指向某种特定类型的对象,该特定类 型称为被引用类型(referenced type): 被引用类型具体为哪种类型没有限制 声明一个指针只是为指针变量本身分配了空间,并没有 为其指向的对象分配空间,也没有让其指向某个对象 指针具体使用时应该用地址值初始化 8 int *p; /* points only to integers */ double *q; /* points only to doubles */ char *r; /* points only to characters */ int *p; /* points nowhere in particular */
先睹为快一指针初始化示例 File Edit View Search Terminal Help int main(int argc,char **argv) 4 56 int *p; int val 1; 7 p &val; 8 printf("%d\n",*p); 9 return 0; 10 } (gdb) 6 int val 1; (gdb) pp $1 (int *0xbffffl0c (gdb)p *p $2=-1073745171 (gdb)s 7 p &val; (gdb)pp $3 =(int *0xbffffl0c (gdb)s 8 printf ("%d\n",*p); (gdb) p &val $4=(int*) 0xbffff044 (g©db)pp $5 (int *) Oxbffff044 (gdb) p *p $6= (gdb) 9
先睹为快 —— 指针初始化示例 9
The Address and Indirection Operators ■C为操作指针提供了两个特殊的操作符 必得到某变量的地址,用取地址(address)操作符:& 得到指针所指对象的内容,用解引用操作符 (indirection): 10
The Address and Indirection Operators C 为操作指针提供了两个特殊的操作符 得到某变量的地址,用取地址(address)操作符:& 得到指针所指对象的内容,用解引用操作符 (indirection) :* 10