*和&
*
* 有两个作用,一个是作为标识符来表示这是一个指针(声明变量时的等号左边),也就是说存放的是地址,另外一个是作为运算符来取值(赋值等号左边)。
int *p=NULL;
int a = 1;
p = &a;
cout<<p<<" "<<*p<<endl<<endl;
测试结果为
0x7ffd2a8c6d84 1
&
& 有两个作用,一个是作为标识符来表示这是一个引用,只是给之前的变量添加了别名而已,另外一个是作为取地址运算符。
int a=1;
cout<<&a<<" "<<a<<endl<<endl;
测试结果为
0x7fffd17a4444 1
指针的三个方面
&B = 0x00000004; //B本身的地址
B= 0x00000008; //存放的地址
*B = "something"; //存放地址中的内容
引用和指针作为函数参数
背景说明:C语言和C++中将变量名作为实参和形参。这时传给形参的是变量的值,传递是单向的。如果在执行函数期间形参的值发生变化,并不传回给实参。因为在调用函数时,形参和实参不是同一个存储单元。//同c
指针作为参数: 传递变量的指针。形参是指针变量,实参是一个变量的地址,调用函数时,形参(指针变量)指向实参变量单元。这种通过形参指针可以改变实参的值。//同c
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
void funcr(string* parms)
{
*parms="funcr xxs";
printf("the string in %s is %p \n",__FUNCTION__,parms);
}
//指针类型可以用相同长度的int或者long来替代,但是要注意在调用的时候进行强制转换。
//32位的指针长度和unsigned int一样
//64位的指针长度和unsigned long一样
void funcAddr(unsigned long addr)
{
string *p;
p=(string*)addr;
printf("the string in %s is %p \n",__FUNCTION__,p);
}
int main() {
string x="something";
funcAddr((long)&x);
string *x_ptr=&x;
funcr(x_ptr);
printf("the string in %s is %p \n",__FUNCTION__,x_ptr);
return 0 ;
}
返回结果为
the string in funcAddr is 0x7ffd08fce890
the string in funcr is 0x7ffd08fce890
the string in main is 0x7ffd08fce890
引用(地址)作为参数:形参是引用变量,和实参是一个变量,调用函数时,形参(引用变量)指向实参变量
单元。这种通过形参引用可以改变实参的值。
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
void funcr(string& parms)
{
parms="funcr xxs";
printf("the string in %s is %p \n",__FUNCTION__,&parms);
}
int main() {
string x="something";
funcr(x);
printf("the string in %s is %p \n",__FUNCTION__,&x);
return 0 ;
}
结果为
the string in funcr is 0x7fff9fbbd1a0
the string in main is 0x7fff9fbbd1a0
引用参数和指针参数的区别:指针作为参数时,实参在定义的时候就是一个指针变量,形参类型也是一个指针类型,而引用作为参数的时候,实参不是指针变量,因为形参是地址,所以形参类型是引用类型,表示传进来的参数不用拷贝,直接用原来地址中的那份。
实例:
- String地址作为参数
- String地址作为参数传过去之后,可以直接新建一个String指针,把传进来的地址赋值给指针之后,这两个地址就指向了同一片内存。
- 目标:在函数中处理实参
- 方法: 把实参的地址作为形参传到函数里面,在函数中定义指针,进行赋值。函数中通过对函数中定义的指针进行操作来达到改变外部实参的作用
- 注意内容:因为传进去的地址,因此,参数类型是int
二级指针
二级指针的作用就是在函数在编译器拷贝的参数外面加一层指针,让真正需要在函数中改变的值的地址作为指针指向的位置来改变。
void GetMemory2(char **p, int num)
{
//这里赋值就直接是给str字符串所在的地址进行赋值
*p = (char *)malloc(sizeof(char) * num);
}
int main(void)
{
char *str = NULL;
GetMemory2(&str,100); // 注意参数是 &str,而不是 str
strcpy(str, "hello");
cout<< str << endl;
free(str);
return 1;
}
智能指针
老罗的博客说明的已经相当的不错