C++——指针
一、地址和指针1.1内存内存由一系列连续的存储单元组成,每个存储单元都有计算机分配的 "编号" ——地址 1.2针和指针变量指针:一个变量的地址称为该变量的指针 二、指针变量2.1始化
2.2赋值1、语法形式 #include <iostream> using namespace std; int main() { // void voidObject; 错,不能声明void类型的变量 void *pv; //对,可以声明void类型的指针 int i = 5; pv = &i; //void类型指针指向整型变量 int *pint = (int*)(pv); //void指针转换为int指针 cout << "*pint = " << *pint << endl; return 0; } 结果: *pint = 5 2.3指针类型算术运算1、指针 p 加上或减去 n 2.4指针类型关系运算指向相同类型数据的指针之间可以进行各种关系运算 2.5指向指针的指针语法形式
三、指针与数组指针运算比数组下标运算的速度快 3.1指针运算1、指针增减 3.2通过指针访问数组元素1、p 指向数组 a 的首地址
2、p 指向数组 a 中的第 i 个元素 #include<iostream> using namespace std; int main() { int * p,a[10] = {1,2,3,4,5,6,7,8,9,0}; p = a; cout << *(p++) << ends; cout << *(++p) << ends; cout << (*p)++ << ends; cout << *(p--) << ends; cout << *(--p) << endl; return 0; } 结果: 1 3 3 4 1 //上述代码为未定义(UB)行为,标准中没有这种用法,属于错误代码,则结果由编译器决定 3.3指针数组数组元素全为指针的数组称为指针数组
但是二维字符数组可以通过下标很方便的修改某一元素的值,而指针数组无法这么做举例 四、指针与字符串4.1字符串的表示形式字符数组存放,如 4.2字符指针作函数参数用字符数组名或指向字符串的指针变量作参数 4.3字符指针变量与字符数组1、字符数组和指针变量的类型和大小不同 //字符数组由若干个元素组成,每个元素中放一个字符 char a[] = "I love China!"; //数组 a 占据 14 个字符的空间,存放字符序列“I love China!”的各个字符以及空字符 //字符指针变量中存放的是地址,只占据一个指针所需要的存储空间,而不是将字符串放到字符指针中 char *string = "I love China!"; //指针 string 只占据一个指针所需要的存储空间 2、赋值方式不同 //字符数组只能对各个元素分别赋值 char str[14]; str = "I love China!"; //非法 //字符指针可以整体赋值 char *string; string = "I love China!"; //赋值的是字符串的首地址 3、赋初值的含义不同 //字符数组 char str[14] = "I love China!"; //不等价于 char str[14]; str = "I love China!"; //数组可以在变量定义时整体赋初值,但不能在赋值语句中整体赋值 //字符指针 char *string = "I love China!"; //等价于 char *string; string = "I love China!"; 4、字符数组在编译时分配内存单元,有确定的地址;字符指针在编译时分配内存单元,放一个地址值而不是一个字符数据 char str[10]; scanf ("%s",str); //正确 char * a; scanf ("%s",a); //不正确,指针 a 的值不确定 //把指针的指向确定 char * str[10],* a; a = str; scanf ("%s",a); //正确 5、指针变量的值可以改变 char *format; format = "a = %d,b = %fn"; pritnf(format,a,b); //等价于 pritnf("a = %d,b = %fn",b); 五、指针与函数函数本身不是变量,但可以定义指向函数的指针,这种指针可以被赋值、存放于数组之中、传递给函数以及作为函数返回值等 5.1语法形式
5.2使用1、赋值 注:函数指针访问函数与通过函数名访问函数区别:
5.3指针做函数参数
用指针作为函数的参数,可以使被调函数通过形参指针存取主调函数中实参指针指向的数据,实现数据的双向传递
实参是数组名时形参可以是指针 //读入三个浮点数,将整数部分和小数部分分别输出 #include<iostream> using namespace std; void splitFloat(float x,int *intPart,float *fracPart) { *intPart = static_cast<int>(x); //取x的整数部分 *fracPart = x - *intPart; //取x的小数部分 } int main() { for(int i = 0; i < 4; i++) { float x,f; int n; cin >> x; splitFloat(x,&n,&f); //变量地址作为实参 cout << "Integer Part = " << n << " Fraction Part = " << f << endl; } return 0; } 结果: 0.0 Integer Part = 0 Fraction Part = 0 1.0 Integer Part = 1 Fraction Part = 0 0.1 Integer Part = 0 Fraction Part = 0.1 1.1 Integer Part = 1 Fraction Part = 0.1 5.4返回指针的函数语法形式
#include<iostream> using namespace std; int* search(int* a,int num); int main() { int array[5]; for(int i = 0; i < 5; i++) cin >> array[i]; int* zeroptr = search(array,5); //将主函数中数组的首地址传给子函数 cout << zeroptr; return 0; } int* search(int* a,int num) { //指针a指向主函数中定义的数组 for(int i = 0; i < num; i++) if(a[i] == 0) return &a[i]; //返回的地址指向的元素是在主函数中定义的 } //函数运行结束时,a[i]的地址仍有 结果: 1 2 3 0 6 0x6ffe2c
#include<iostream> using namespace std; int* newintvar(); int main() { int* intptr= newintvar(); *intptr = 5; //访问的是合法有效的地址 cout << *intptr << endl; delete intptr; //如果忘记释放,会造成内存泄漏 cout << *intptr << endl; cout << intptr; return 0; } int* newintvar () { int* p = new int(); return p; //返回的地址指向的是动态分配的空间 } //函数运行结束时,p中的地址仍有效 结果: 5 1727504 0x1a17d0 //二三行结果每次都不一样 5.5指向函数的指针1、语法形式
将函数的指针作为参数传递给另一个函数,使得在处理相似事件时可以灵活使用不同方法
#include<iostream> using namespace std; int computer(int a,int b,int (*func)(int,int)) { return func(a,b); } int max(int a,int b) { return a > b ? a : b; } int min(int a,int b) { return a < b ? a : b; } int sum(int a,int b) { return a + b; } int main() { int x,y,res; cin >> x >> y; res = computer(x,&max); cout << "Max of " << x << " and " << y << " is " << res << endl; res = computer(x,&min); cout << "Min of " << x << " and " << y << " is " << res << endl; res = computer(x,&sum); cout << "Sum of " << x << " and " << y << " is " << res << endl; return 0; } 结果: 413 509 Max of 413 and 509 is 509 Min of 413 and 509 is 413 Sum of 413 and 509 is 922 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |