指针的操作
1、p+1
指针变量p,获取a变量的地址后,再加上1,结果会是什么? 直接上码:
#include<iostream>
int main()
{
int a = 10;
int *p;
p = &a;
std::cout << "p: " << p << "\n";
std::cout << "p+1: " << p+1 << "\n";
}
运行结果:
结果解析:
答:注意结果后面的 44 和 48,为什么 p+1 后,44 变成 48 呢?这就是因为p是一个整型指针,p+1 则将其增加一个单位,将我们带到下一个整型地址,因为整数在内存的大小是4个字节。所以,去下一个地址,整数地址就会跳过四个字节,所以,p+1 将p增加四个字节。
你可以使用 sizeof(int); 来查看整型占用内存是多少! 或者试试字符类型,浮点型等等。
(在我之前文章有教这个sizeof()函数的使用)
2、*(p+1)
#include<iostream>
int main()
{
int a = 10;
int *p;
p = &a;
std::cout << "p: " << p << "\n";
std::cout << "p+1: " << p+1 << "\n";
std::cout << "*(p+1): " << *(p+1) << "\n";
}
运行结果:
What happen?? *(p+1)等于2293316,这是什么?
答:p+1的地址已经改变了,然后执行*(p+1),也就是执行该地址的值,运行结果来看,实际上它是一个垃圾值,因为我们没有真正给它的整数,这是使用指针算法的C的一个危险的事情。使用指针操作,你可以达到任何地址,而有时这些操作可能会给你的程序带来不必要的行为。
int -> 4个字节
char -> 1个字节
float -> 4个字节
3、
p0 = (char*)p; 强转换指针类型
#include <iostream>
int main()
{
int a = 2015;
int *p;
p = &a;
std::cout << "size of integer is " << sizeof(int) << "\n";
std::cout << "p: " << p << "\n";
std::cout << "*p: " << *p << "\n";
char *pp;
pp = (char*)p;
std::cout << "size of integer is " << sizeof(char) << "\n";
std::cout << "pp: " << pp << "\n";
std::cout << "*pp: " << *pp << "\n";
}
4、
无效指针 void
#include <iostream>
int main()
{
int a = 2015;
int *p;
p = &a;
std::cout << "size of integer is " << sizeof(int) << "\n";
std::cout << "p: " << p << "\n";
std::cout << "*p: " << *p << "\n";
void *p0;
p0 = p;
//只能打印地址
std::cout << "p0: " << p0 << "\n";
//不能打印值
std::cout << "*p0: " << *p0 << "\n";
}
5、
指向指针的指针
#include<iostream>
using namespace std;
int main()
{
int x = 5;
int* p = &x;
* p = 6;
int** q = &p;
int*** r = &q;
cout << "*p = " << *p << "\n";
cout << "*q = " << *q << "\n";
cout << "**q = " << *(*q) << "\n";
cout << "**r = " << *(*r) << "\n";
cout << "***r = " << *(*(*r)) << "\n";
***r = 10;
cout << "x = " << x <<"\n";
**q = *p + 2;
cout << "x = " << x << "\n";
}
运行结果:
算法和数据结构是程序的第一秘诀,缺之算法和数据结构是编程的最大原因。