今日学习札记——C++指针3(11.4)
来源:互联网 发布:手机拍摄淘宝视频 编辑:程序博客网 时间:2024/05/23 17:43
5.指针——管理地址信息,按地址管理数据
- 指针定义与基本操作
# 定义:
1)<类型> *<指针变量>
例子:int *p;
int *p,*q; //定义多个指针变量时,每个指针变量前都要有*
2)用typedef定义一个指针类型
typedef int* Pointer;
Pointer p,q;
3)指针赋值
int *p = 0x080483A0;
int *p = (int *) 0x080483A0;
# 操作符
& 取地址
* 间接取内容
例:int x =9;
int *p;
p = &x;
*p =1000;
# 指针运算
1)赋值(必须同类型)
例:int x; double d; int *p,*q;
p = &x;
p = &d; (False)
*p = *q;
p = NULL;
2)+/-整型值:当一个指针值与一个整型值进行+/-运算时,实际+/-的数值由该指针的基类型决定
例:int *p; double *q;
p++; //p的值加4(按单元计)
q++; //q的值加8
3)同类型指针相减
同类型指针可以相减,结果为整型值
例:int a[10];
int *p,*q,offset;
p = &a[0];
q = &a[3];
offset = p-q; //offset =3(个单元)
4)同类型指针比较
==、!=
5)指针本身的值与指针所指向元素的值
例1:int x=1; int *p = &x;
cout <<p;
cout <<*p;
例2(特例):
char *p = "ABCD";
cout << p; //p指向的字符串,即: ABCD、
cout <<*p; //p指向的字符,即:A
cout << (void *)p; //p的值
# void *
1)任何类型的指针均可以赋值给void *
例: void *any_pointer;int x; double y;
any_pointer = &x;
any_pointer = &y;
2)不能进行其他指针运算和间接引用,除非做强制类型转换
例:*any_pointer (False)
*((int *) any_pointer ) (True)
*((double *) any_pointer ) (True)
例:将某指针所指向的一块内存清零
void memset(void *pointer, unsigned size){
char *p = (char *) pointer;
for( int k=0; k<size; k++)
*p++=0;
}
# 常量指针与指针常量
1)常量指针 const <类型> *<指针变量>
例:const int x =0;int y;
const int *p; //只读
int *q;
p=&x;
q=&y;
*p=1; //False
*q=2; //True
必须在定义时初始化(p只能在出生的时候定义一次)
例:int x,y;
int * const p = &x;
p = &y; //True
*p = 1; //False
- 指针与函数
# 指针作为形参
1)提高传输效率
2)函数副作用
3)常量控制
# 指向函数的指针
……(待定)
- 指针与数组
# 数组元素操作
例:int a[10]; int *p; int i;
p = &a[0]; <=> p=a;
a[i] <=> *(a+i) <=> *(p+i) <=> p[i];
&a[i] <=> a+i <=> p+i <=> &p[i];
# 数组元素的指针表示法
例:int b[20][10]; //typedef int A[10]; A b[10];
int *q;
q = &b[0][0]; <=> q=b[0];
b[i][j] <=> *(&b[0][0]+i*10+j) <=> *(q+i*10+j) <=>q[i*10+j]
A *p; <=> int (*p)[10];
p = &b[0]; <=> p=b;
b[i][j] <=> *(*(b+i)+j) <=> *(*(p+i)+j) <=> p[i][j]
# 指针数组:数组中的元素为指针
char *s1[] = {"C++","PASCAL","FORTRAN"};
- 指针和结构
# 结构成分的访问
(*p).x <=> p->x
# 结构作为函数参数
1)大块数据传输
2)const
- 多级指针
# 指针变量所指向的数据类型为指针类型
例1:int **pp; //pp为指针变量,指向另一个指针变量(int *)
int *p;
int x =2;
p = &x; pp = &p
*p =100; **p = 200;
例2:编写一个函数,交换两个字符串
void swap(char **p1, char **p2)
{ char *tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
void main()
{ char *p1 = "abcd";
char *p2 = "1234";
cout << p1 << " " << p2 << endl;
swap( );
cout << p1 << " " << p2 << endl;
}
# 指针变量必须初始化或赋值,否则将会导致运行时刻的重要错误
- 指针定义与基本操作
# 定义:
1)<类型> *<指针变量>
例子:int *p;
int *p,*q; //定义多个指针变量时,每个指针变量前都要有*
2)用typedef定义一个指针类型
typedef int* Pointer;
Pointer p,q;
3)指针赋值
int *p = 0x080483A0;
int *p = (int *) 0x080483A0;
# 操作符
& 取地址
* 间接取内容
例:int x =9;
int *p;
p = &x;
*p =1000;
# 指针指向一个变量:指针变量的值为另一个变量的地址
# 初始化 (0,NULL不指向任何对象)
# 指针运算
1)赋值(必须同类型)
例:int x; double d; int *p,*q;
p = &x;
p = &d; (False)
*p = *q;
p = NULL;
2)+/-整型值:当一个指针值与一个整型值进行+/-运算时,实际+/-的数值由该指针的基类型决定
例:int *p; double *q;
p++; //p的值加4(按单元计)
q++; //q的值加8
3)同类型指针相减
同类型指针可以相减,结果为整型值
例:int a[10];
int *p,*q,offset;
p = &a[0];
q = &a[3];
offset = p-q; //offset =3(个单元)
4)同类型指针比较
==、!=
5)指针本身的值与指针所指向元素的值
例1:int x=1; int *p = &x;
cout <<p;
cout <<*p;
例2(特例):
char *p = "ABCD";
cout << p; //p指向的字符串,即: ABCD、
cout <<*p; //p指向的字符,即:A
cout << (void *)p; //p的值
# void *
1)任何类型的指针均可以赋值给void *
例: void *any_pointer;int x; double y;
any_pointer = &x;
any_pointer = &y;
2)不能进行其他指针运算和间接引用,除非做强制类型转换
例:*any_pointer (False)
*((int *) any_pointer ) (True)
*((double *) any_pointer ) (True)
例:将某指针所指向的一块内存清零
void memset(void *pointer, unsigned size){
char *p = (char *) pointer;
for( int k=0; k<size; k++)
*p++=0;
}
# 常量指针与指针常量
1)常量指针 const <类型> *<指针变量>
例:const int x =0;int y;
const int *p; //只读
int *q;
p=&x;
q=&y;
*p=1; //False
*q=2; //True
2)指针常量 <类型> * const <指针变量>
必须在定义时初始化(p只能在出生的时候定义一次)
例:int x,y;
int * const p = &x;
p = &y; //True
*p = 1; //False
- 指针与函数
# 指针作为形参
1)提高传输效率
2)函数副作用
3)常量控制
# 指向函数的指针
……(待定)
- 指针与数组
# 数组元素操作
例:int a[10]; int *p; int i;
p = &a[0]; <=> p=a;
a[i] <=> *(a+i) <=> *(p+i) <=> p[i];
&a[i] <=> a+i <=> p+i <=> &p[i];
# 数组元素的指针表示法
例:int b[20][10]; //typedef int A[10]; A b[10];
int *q;
q = &b[0][0]; <=> q=b[0];
b[i][j] <=> *(&b[0][0]+i*10+j) <=> *(q+i*10+j) <=>q[i*10+j]
A *p; <=> int (*p)[10];
p = &b[0]; <=> p=b;
b[i][j] <=> *(*(b+i)+j) <=> *(*(p+i)+j) <=> p[i][j]
# 指针数组:数组中的元素为指针
char *s1[] = {"C++","PASCAL","FORTRAN"};
char s2[][8]={"C++","PASCAL","FORTRAN"};
- 指针和结构
# 结构成分的访问
(*p).x <=> p->x
# 结构作为函数参数
1)大块数据传输
2)const
- 多级指针
# 指针变量所指向的数据类型为指针类型
例1:int **pp; //pp为指针变量,指向另一个指针变量(int *)
int *p;
int x =2;
p = &x; pp = &p
*p =100; **p = 200;
例2:编写一个函数,交换两个字符串
void swap(char **p1, char **p2)
{ char *tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
void main()
{ char *p1 = "abcd";
char *p2 = "1234";
cout << p1 << " " << p2 << endl;
swap( );
cout << p1 << " " << p2 << endl;
}
# 指针变量必须初始化或赋值,否则将会导致运行时刻的重要错误
0 0
- 今日学习札记——C++指针3(11.4)
- 今日学习札记——C库函数(11.13)
- 今日学习札记——C语言指针与程序风格(11.6)
- 今日学习札记——需求工程基础(11.4)
- 今日学习札记——C++Primer补充1(11.7)
- 今日学习札记——C++Primer补充2(11.8)
- 今日学习札记——数据结构基础(11.7)
- 今日学习札记——<string>模板类(11.17)
- 今日学习札记——<string>初步(11.17)
- 今日学习札记——STL通用算法(11.20)
- 今日学习札记——C语言一些基本语法(11.6)
- 今日学习札记——C++程序设计1(11-02)
- 今日学习札记——STL常用容器:vector、list、set和multiset、map和multimap(11.17)
- 今日学习札记--C++程序设计2(11.3)
- C++Primer学习札记_指针和const限定符
- 今日学习总结指针
- boost——智能指针札记
- python 学习札记(3)
- 通过bundle id打开应用
- Android应用之——不要将数据存储在Application类中
- FMDB的使用
- 大型网站技术架构
- Java中带包的类的编译与执行
- 今日学习札记——C++指针3(11.4)
- Network Link Conditioner
- [重新认识cocos2dx---工具篇] 一 cocos命令行之语言包MultiLanguage
- Gradle 笔记——Java构建入门
- xcode7不允许HTTP传输的过渡办法
- mac安装redis3.0.5分布式集群
- HttpClient设置请求超时和读取超时
- ios app 修改名称后,收到的推送通知 显示的仍然是上一个名称 问题
- node.js study