今日学习札记——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;
# 指针指向一个变量:指针变量的值为另一个变量的地址
# 初始化 (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
原创粉丝点击