下面一个一个解决这些问题。
解决上面的问题之前,先弄清,指针是什么,我们为什么要用它。
定义:指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。
那么为什么要用指针呢?我们可以直接使用已经声明的变量或者常量啊。
答:可以想从下面几点想。
1、如果我们想在程序中共享一块内存,通俗的说就是好几个地方都想用一个内存的值,是不是这时候用指针比较方便。
2、比如链表等数据结构,用指针实现会不会比较容易
其他用处不说了,总之可以看出是为了更方便的使用数据。
总 结 : 为 了 更 方 便 的 去 使 用 数 据 \color{red}{总结: 为了更方便的去使用数据} 总结:为了更方便的去使用数据
问题一: 指针指向指针的故事
其实这个问题挺简单,只是以前被我想复杂了,主要是二维数组的例子。
先看一个图:
然后看下 *p , **p, , ***p的例子:
void pointerToPointer(){
int a = 3;
int* p = &a;
int** pp = &p;
int*** ppp = &pp;
cout << “a的地址:” << &a << endl;
cout << “p的地址:” << &p << endl;
cout << “pp的地址:” << &pp << endl;
cout << “ppp的地址:” << &ppp << endl;
cout << “p的指向地址:” << p << endl;
cout << “pp的指向地址:” << pp << endl;
cout << “ppp的指向地址:” << ppp << endl;
}
打印结果如下:
a的地址:0x7ffeefbff55c
p的地址:0x7ffeefbff550
pp的地址:0x7ffeefbff548
ppp的地址:0x7ffeefbff540
p的指向地址:0x7ffeefbff55c
pp的指向地址:0x7ffeefbff550
ppp的指向地址:0x7ffeefbff548
结论:
由程序可以看出,ppp->pp->p-> a,这个就是指针指向指针。
问题二:& 和 指针 是什么关系
& 取地址、引用的意思。
从上个例子可知,&a为a的内存地址。
它和指针没有关系,为什么以前有误区,因为弄不清指针地址,和指针指向地址的概念。
问题三: 数组和指针的关系
相信学C语言的同学一定想过这个问题。
首先数组的数据结构了解一下,数组会开辟一个连续的内存地址存储序列,那么访问数组的话,我们只需要知道头地址和长度就可以全部推出来吧。
知道了这个理解起来就简单多了。
看下面代码:
void arrayAndpointer(){
int a[5] = {1,2,3,4,5};
// a = &a[0] a是a[0]取地址的另外一种写法
//然后 p指针指向首地址
int * p = a;
for (int i = 0; i < 5; i++) {
cout << “p指向地址的值:” << *p << endl;
p++;
}
}
看了代码和备注是不是理解就简单多了。
问题四: 函数指针和指针函数
纸老虎!!!
别被他们俩的名字给吓住了。相当于a++ , ++a。
指针函数:是一个函数,只不过返回一个指针。
函数指针:就是一个指针。
这种问题就是看最后面的名词,是什么就是什么其他都是修饰成分。
先说一下指针函数(看下代码就懂了):
std::string thisIsAPointFunc();
int main(int argc, const char * argv[]) {
cout << thisIsAPointFunc() << endl;
return 0;
}
string thisIsAPointFunc(){
string s = “这是一个指针函数”;
return s;
};