C++/oop---指针
C++/oop---指针
按理说指针不是c++特有的东西,只是我恰好发现自己不太会,赶紧补一下
int *p 定义指针 p 指向 int 型变量
以下写法均可
int* p / int * p
p = &a (& 取地址)
指针本身的类型是 unsigned long int
*p 取内容
指针保存着变量的地址,改变指针所指的地址上的值即改变变量
int a=1; int *p=&a; cout<<p<<' '<<*p<<endl; //0x1ed4fe1c 1 *p=2; cout<<a<<endl;
//2
空指针
int *p=NULL;//或者写0
则 p 指向 0 ,也就是什么都没有
指针可以++ ,-- 这在指针指向数组元素时有用
其中++-- 都是有乘比例因子的,因子与数据类型有关。
指向数组的指针
数组名其实是一个地址,指向数组的头
int x[10]={1,2,3}; int *p=x;// 同为指针,就不需要取地址了 cout<<p<<' '<<(*p)<<' '<<p[0]<<' '<<p[1]<<endl; //0x1ed4fdf0 1 1 2
例如x=0x1ed4fdf0
x[0] 应该是*x的另一种写法
x[1]为*(x+1)
...
也就是一维数组的本质是指针,给函数传数组相当于传一个指针
int f(int *a){ int sum=0; for(int i=0;i<10;i++)sum+=a[i]; return sum; } int main(){ int x[10]={1,2,3}; cout<<f(x)<<endl; return 0; }
似乎写成 int f(int a[]) 也可以,原理似乎是一样的
二级指针
int i, *p = i; int **pp = &p;
应该用处不大
指针数组
int *s[10]; 相当于10个指针
数组指针
int (*s)[10] 小括号不可省略
表示一个指向有十个元素的一维数组的指针
这可以用来处理二维数组
#include <cstdio> #include <iostream> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> using namespace std; int main(){ int x[2][3] = {{1,2,3},{4,5,6}}; int (*p)[3]=x; for(int i=0;i<2;i++){ for(int j=0;j<3;j++){ cout<<*(*(p+i)+j)<<' '; // p[i][j] } puts(""); } return 0; }
指针和字符串
char *s1 = "Hello world!"
系统在内存中开了一个长度为 13 的空间来储存字符串,并且将首地址给了 s1
13 = 12 + '\0'
等价写法 char s1[] = "Hello world!"