目录
1.1指针的基本概念
1.2指针变量的定义和使用
1.3指针所占内存空间
1.4空指针和野指针
1.5const修饰指针
1.6指针和数组
1.7指针和函数
1.8指针、数组、函数
1.1指针的基本概念
作用:可以通过指针间接访问内存
1.2指针变量的定义和使用
1.定义指针
语法:数据类型 *指针变量名;eg:int *p;
让指针记录变量a的地址 p=&a;
2.使用指针
可以通过解引用(指针前面加个*)的方式来找到指针指向的内存,即代表的是指针指向内存中的数据。
1.3指针所占内存空间
在32位操作系统下占用4个字节,64位下占用8个。
sizeof(float *)/sizeof(int *)/sizeof(double *)/sizeof(char *)都是
1.4空指针和野指针
空指针:指针变量指向内存编号为0的空间
用途:初始化指针变量
注意:空指针指向的内存是不可以访问的
eg:int *p=NULL;----空指针
*p=100;或者打印*p----运行后系统会出错,因为0~255之间的内存编号是系统占用的,因此不可以被访问。
野指针:指变量指向非法的内存空间
eg:int *p=(int *)0x1100; //指针变量p指向内存地址编号为0x1100的空间
注意:空指针和野指针都不是我们申请的空间,因此不要访问
1.5const修饰指针
修饰指针----常量指针
eg:int a=10;int b=20; const int *p=&a;(const后面是int *,所以*的操作不能做)
特点:指针的指向可以修改,指针指向的值不可以修改
*p=20;--错
p=&b;--对
修饰常量----指针常量
eg:int * const p=&a;(const后面是p,所以p的操作是错的)
特点:指针的指向不可以修改,指针指向的值可以修改
3.即修饰指针又修饰常量
eg:const int * const p=&a;(const后面是int *,const 后面也是p)
特点:指针的指向不可以修改,指针指向的值不可以修改
1.6指针和数组
作用:利用指针访问数组中的元素
案例:利用指针访问整个数组元素,并打印
#include<iostream>
using namespace std;
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int *p = arr;//指向首元素
for (int i = 0; i < 10; i++)
{
cout << *p<< endl;
p++;
}
system("pause");
return 0;
}
1.7指针和函数
1.值传递
2.地址传递
如之前交换两数案例:
#include<iostream>
using namespace std;
void swap(int a, int b)
{
int temp=0;
temp = a;
a = b;
b = temp;
}
void swap2(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int a = 10;
int b = 20;
//值传递
swap(a, b);
cout << a << " " << b << endl;
//地址传递
swap2(&a, &b);
cout << a << " " << b << endl;
system("pause");
return 0;
}
此时,运行就会发现下面的ab两个值发生了交换。
1.8指针、数组、函数
案例:利用冒泡排序,实现对整型数组的升序
需要传入数组首地址、数组长度这两个参数
#include<iostream>
using namespace std;
void maopao(int *arr, int len)//数组首地址、数组长度
{
for (int i = 0; i < len-1; i++)
{
for (int j = 0; j < len - i - 1; j++)
{
if (arr[j]>arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j+1];
arr[j + 1] = temp;
}
}
}
}
int main()
{
int arr[10] = { 4, 3, 6, 9, 8, 7, 2, 1, 0, 5 };
int len = sizeof(arr) / sizeof(arr[0]);
maopao(arr, len);
//打印数组
for (int i = 0; i < 10; i++)
{
cout <<arr[i]<< endl;
}
system("pause");
return 0;
}