星号两边的空格无关紧要,并不影响指针的声明:
int* p; int * p; int *p;这几者都是一样的,等价的
注意:指向还没有初始化内存的指针可能会产生问题。如果将这种未初始化的指针进行解引,指针的内容会是一些不合法的数据,造成程序的异常。地址操作符& 返回操作数的内存地址。这个内存地址可以用来初始化指针。
例如: int num = 10; int* p = # //对数据num取内存地址,并赋值给指针p。 p的值就是存放num数据的内存地址 //p的数据类型为: int* 类型的指针 , num的数据类型则为int解引指针使用*号操作符。解引将返回指针指向的内存地址的数据。即指针的值(另一个变量的内存地址)所在的位置储存的数据。
例如: 上例中: int numval = *p; //对指针p进行解引操作,并且赋值给numval, //变量numval的值就是p指针指向内存地址的那个数据。即num的值10.void指针的声明: void* p 表示这个指针p可以用来存放任何数据类型的引用。
注意: 1. 任何指针都可以被赋值给void指针,并且可以被转换为原来的指针 2. void指针和其他指针永远不会相等 3. 两个赋值为NULL的void指针是相同的 4. void指针只能作为数据的指针,不能作为函数指针指针的长度是有其所在的机器和编译器来决定的。与指针的数据类型没有关系。
例如: int num = 123; double num2 = 123.4; int* p=# double* p1 = &num2; //指针p.和p1 的长度是相同的。都可能占用的是4个字节。声明指针 int p=NULL;
*解引指针 int num = *p;
-> 指向引用的成员数据 p->name
+加 p++, p+1,p+2
-减 p–,p-1,p-2
== != 是否相等 p1 == p2
< <= > >=大小 p1>=p2
(数据类型)转换
double vertor[] = {10,20,30,40,50,60}; double* p = vertor; std::cout << *p << std::endl; //10 std::cout << p << std::endl; //0x7ffee37b6a20 std::cout << *p << std::endl; //10 p += 2; std::cout << p << std::endl; //0x7ffee37b6a30 std::cout << *p << std::endl; //30 p ++; std::cout << p << std::endl; //0x7ffee37b6a38 std::cout << *p << std::endl; //40 指针的加减: 1. 两个指针加减,表示指针之间内存地址的差值。 2. 指针本身加减,表示指向下一个指针内存,大小为指针类型的大小乘以加减的数值。 3. void 指针不可以进行加减操作。