指针
1.指针基本概念2.基本指针使用3. 空指针与野指针4. 指针与一维数组5.多级指针6.指针与函数
指针 1.指针基本概念定义:指针就是地址,地址是内存单元的编号
作用:
能够直接访问硬件使函数返回一个以上的值能够表示复杂的数据结构,快速的传递数据,减少内存的耗用
语法: 数据类型 * 变量名;
2.基本指针使用注:
可以通过 & 符号 获取变量的地址利用指针可以记录地址对指针变量解引用,可以操作指针指向的内存
示例1:指针定义
#include示例2:指针使用int main(void) { int *p; // 1> p 是变量的名字, int* 表示p变量存放的是int类型变量的地址 // 2> int *p ; p 是变量名, p 变量的数据类型是 int * 类型 // 3> int * 类型 就是存放int 变量地址的类型 int i = 3; int j; p = &i; j = *p; printf("i = %d, j = %dn", i, j); return 0; }
# include示例3:指针经典程序-互换两个数字int main(void) { int * p;//等价于 int *p; 也等价于 int* p; int i = 5; char ch = 'A'; p = &i; // *p 以p的内容为地址的变量 *p = 99; printf("i = %d, *p = %dn", i, *p); //p = &ch; //p = ch; //error //p = 5; //error return 0; }
# include3. 空指针与野指针void huhuan_1(int, int); void huhuan_2(int *, int *); void huhuan_3(int *, int*); int main(void) { int a = 3; int b = 5; huhuan_1(a, b); printf("a = %d, b = %dn", a, b); return 0; } //不能完成互换 void huhuan_1(int a, int b) { int t; t = a; a = b; b = t; printf("a1 =%d, b1 =%dn", a, b); return; } //不能完成互换功能 //形参属于局部变量,只能在本函数中使用 void huhuan_2(int *p, int * q) { int * t;//如果要互换p和q的值,则t必须是int *,不能是int,否则会出错 t = p; p = q; q = t; return; } void huhuan_3(int * p, int* q) { int t; // 如果要互换*p和*q的值,则t必须定义成int t = *p; *p = *q; *q = t; return; }
空指针:指针变量指向内存中编号为0的空间
用途: 初始化指针变量
注意: 空指针指向的内存是不可以访问的
示例:空指针
int main() {
//指针变量p指向内存地址编号为0的空间
int * p = NULL;
//访问空指针报错
//内存编号0 ~255为系统占用内存,不允许用户访问
cout << *p << endl;
system("pause");
return 0;
}
野指针:指针变量指向非法的内存空间
示例:野指针
int main() {
//指针变量p指向内存地址编号为0x1100的空间
int * p = (int *)0x1100;
//访问野指针报错
cout << *p << endl;
system("pause");
return 0;
}
4. 指针与一维数组
**作用:**利用指针访问数组中元素
示例:# include5.多级指针int main(void) { int a[5]; /a是数组名 5是数组元素的个数 元素就是变量 a[0] -- a[4] // int a[3][4]; //3行4列 a[0][0]是第一个元素 a[i][j]第i+1行j+1列 int b[5]; //a = b;//error a是常量 printf("%#Xn", &a[0]); printf("%#Xn", a); return 0; } / 输出结果是: -------------- 0x12FF6C 0x12FF6C Press any key to continue -------------- 总结: 一维数组名 一维数组名是个指针常量 它存放的是一维数组第一个元素的地址 /
示例:
#include6.指针与函数int main(void) { int i = 10; int *p = &i; /p只能存放int类型变量的地址 int **q = &p; /q是int**类型,只能存放int*类型变量的地址 int ***r = &q; /r是int***类型,只能用来存放int**类型变量的地址 printf("i = %dn",***r); / ***r表示的是i return 0;
**作用:**利用指针作函数参数,可以修改实参的值
示例:void swap1(int a ,int b)
{
int temp = a;
a = b;
b = temp;
}
/地址传递
void swap2(int * p1, int *p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main() {
int a = 10;
int b = 20;
swap1(a, b); // 值传递不会改变实参
swap2(&a, &b); //地址传递会改变实参
cout << "a = " << a << endl;
cout << "b = " << b << endl;
system("pause");
return 0;
}
总结: 如果不想修改实参,就用值传递,如果想修改实参,就用地址传递



