指针
/*指针一个很大重要作用——间接改值*/
int a = 10;
int* pa = &a;
*pa = 22;
cout << "a = "<<a << endl;//此时a的值为22
/*无论何种类型,指针大小一般为4*/
int *pa;//空指针,不建议,在此仅作为下面示例
double *pb;
//sizeof(pa)和sizeof(pb)都为4
/*指针赋值的时候必须强制转换*/
int *pt;
pt=0xB8000000;//错误
pt=(int *)0xB8000000;//正确
new运算符
/*new 运算符分配内存 分配一个未命名内存 下面的c地址与pc地址不同
new 分配的空间一般位于 *堆* 或 *自由存储区*
普通变量一般在 *栈* 中
下面的两个地址不是一样的,new是新开辟的*/
short c = 6;
short* pc = new short;
*pc = 6;
cout << "the condition of c : " << &c<<endl;
cout << "the value of the pc : " << pc << endl;
//创建数组
int* arr1 = new int[10];
delete[] arr1;
//使用new创建动态结构体
fruit* apple = new fruit;
apple->color = "red";
cout << "apple :" << (*apple).color << endl;
//使用new创建动态结构体数组
pizza *p = new pizza[3];
p[1].r = 1;
(p+1)->r=1;//这两行都挺好的
*(p + 1).r =1;//结构体数组中这种是错误的
delete运算符
/*使用原则如下:
(1)delete只能释放new分配的内存
(2)delete不能释放同一内存两次
(3)建数组: delete[] 数组名*/
指针、数组和指针运算
//数组名就是首元素地址
int arr[3]{ 1, 2, 3 };
int* p = arr;
//以下为a=arr[2]的几个版本
a=arr[2];
a=*(arr+2);
a=*(p+2);
//很重要概念:flower表示char的地址,"rose"中的也是传给cout字符串地址//
char flower[10] = "rose";
注意:1.不要直接给未初始化的指针来进行输入操作
如:char* str;
cin>>str;
2.在输出字符串地址的时候要强制类型转换
如:char *str=“hello”;
cout<<“地址为:”<<(int *)str<<endl;
3.数组地址和数组首元素的区别
如:int arr[3]={1,2,3};
&arr表示整个数组地址,假设arr=0(仅假设),那么arr+1=0+3x4
arr表示数组首元素的地址,arr+1=0+1x4