浏览 2232 次
锁定老帖子 主题:C++指针
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-05-22
最后修改:2010-12-27
而数组长度要用strlen(...)方能求出. 字符数组要用strcpy()进行赋值,而string 类型变量可直接用'='进行赋值 相应的strcat()可替换成'+=',strcmp()==0可替换成'==','>',由此C++比C方便的多. 我们利用string name;name.c_str();可将c++字符串转化成C风格字符串. 指针是用来保存地址的变量. &是用来取地址的,而数组名也是一个地址,这一点要注意. #include <iostream.h> //using namespace std; int main() { double d = 12.34; cout << &d << endl; cout << *&d << endl; *&d = 56.34; cout << d << endl; int a[5] = {1,2,3,4,5}; cout << *a << endl; } #include <iostream.h> //using namespace std; struct Date{ int year; int month; int day; }; int main() { Date d={2002,7,6}; cout << "&d=" << &d << endl; cout << "&d.year=" << &d.year << endl;//输出会一样 } //指针 #include <iostream.h> //using namespace std; char* input (char* p) { cout << "input your name:" ; cin >> p; //如果p指向的是一个int,那么此处为*p,char是特殊处理 return p; //C++的这种处理是为了与C语言相兼容 } int main() { char name[20]; cout << input(name) << endl; } 二级指针加两个'*',使用时也是一样. 建议在程序里不要超过二级指针. //多级指针 #include<iostream> using namespace std; int main() { int n = 100; int* p = &n; int** q = &p; int*** r = &q; cout << "***r=" << ***r << endl; } Any data type in C++ can be a pointer type. 指针数组:(难点) int* a[5];//申明了5个指向整形的指针. int (*a)[5];//申明了一个指向整形数组的指针. #include <iostream.h> using namespace std; int main() { int a[5] = {3,4,5,6,7}; for(int i=0; i<5; i++) cout << a[i] << ' '; cout << endl; int* p = a; //指针可以当成数组的首地址一样使用. for(int i=0; i<5; i++) cout << p[i] << ' '; cout << endl; } //数组的地址的运算 #include <iostream.h> using namespace std; int main() { // conclusion: // a+i == &a[i] // *&a[i] == a[i] // 注意越界访问,破坏其它变量 int a[5] = {3,4,5,6,7}; cout << 'a=' << a << endl; cout << 'a+0=' << a+0 << endl; cout << "&a[0]=" << &a[0] << endl; cout << 'a+1=' << a+1 << endl; cout << "&a[1]=" << &a[1] << endl; cout << 'a+2=' << a+2 << endl; cout << "&a[2]=" << &a[2] << endl; cout << 'a+3=' << a+3 << endl; cout << "&a[3]=" << &a[3] << endl; cout << 'a+4=' << a+4 << endl; cout << "&a[4]=" << &a[4] << endl; } //指针的加加运算 int a[5] = {3,4,5,6,7}; int* p = a; for(int i=0;i<5;i++) cout << *(p++) <<endl; //注意此时的P已经指向了最后地址 cout << "p-a=" << p-a << endl;//输出为:5 一定要注意字符地址,特殊处理.输入输出的时候,会输相字符串. 指针在使用前必须初始化. 指针的类型决定了指针所参与的运算. * 指针只能进行加减法运算. 结构指针: 结构是一种数据类型 结构类型也有指针. int a[5]; int (*p)[5];//指向一个数组的指针 p = &a; *p == a; //true (*p)[3] == a[3] //true Date* p; (*p).year 可简化成:p->year//两者含义完全相同. *************************************************************** *************************************************************** 内存管理与引用 内存的申请与释放 * 堆空间 分配:申请,借用 回收:释放,归还 new 类型 结果是一个地址,在堆中申请一个变量的空间,返回这个变量的地址. delete 地址,delete new int;//这样写毫无意义. Date* p = new Date;//此时P在栈里,而空间却在堆里. //eg. #include <iostream.h> using namespace std; int main() { double * p = NULL; //空指针 p = new double; //申请空间 cout << "p=" << p << endl; cout << "*p=" << *p << endl; *p = 123231.3242; cout << "*p=" << *p << endl; delete p; //释放空间 int n; cout << "input the number: " ; p = new double[n]; //申请一个数组空间 cout << "input " << n << " data:"; for(int i=0; i<n; i++ ) cin >> p[i]; for(int i=n-1; i>=0; i-- ) cout << p[i] << ' '; cout << endl; delete[] p; //归还一个数组空间 //释放空间后,P没有任何变化.指向了一块释放了的地方 cout << "after delete : p=" << p << endl; p = NULL; } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |