指针的定义和使用
指针定义的语法:数据类型 * 指针变量名
使用指针:
可以通过解引用的方式来找到指针指向的内存;
指针前加*代表解引用,找到指针指向的内存中的数据。
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int* p; //定义指针语法:数据类型 *指针变量名
p = &a; //指针指向变量a的地址,&a表示取a的地址
//int* p = &a;等价于上面两行
cout << a << endl;
cout << p << endl;
*p = 100; //通过*操作指针指向变量的内存,*p表示取a的值
cout << a << endl;
cout << *p << endl;
system("pause");
return 0;
}
输出:
10
00FDFEA0
100
100
指针所占的内存空间
指针也是一种数据类型。
在32位操作系统下,指针是占4个字节空间大小,不管什么数据类型;
在64位操作系统下,指针是占8个字节空间大小,不管什么数据类型;
空指针
空指针:指针变量指向内存中编号为0的空间。
用途:初始化指针变量。
注意:空指针指向的内存是不可以访问的。
int* p = NULL; //空指针用于给指针变量进行初始化
//空指针是不可以进行访问的
//0~255之间的内存编号是系统占用的,因此不可以访问
cout << *p << endl; //编译失败
*p = 100; //编译失败
野指针
野指针:指针变量指向非法的内存空间。
野指针的成因:
1、指针未初始化:
指针变量刚被创建时不会自动成为NULL指针,它所指向的空间是随机的;
2、指针越界访问:指针指向的范围超出了合理范围,或者调用函数时返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放;
3、指针释放后未置空:释放后的指针应立即将指针置为NULL,防止产生“野指针”。
const修饰指针
1、const修饰指针——常量指针
指针指向的值不可以改;
指针的指向可以改。
const int* p1=&a;
p1=&b;//正确
*p1=100;//错误
2、const修饰常量——指针常量
特点:
指针的指向不可以改;
指针指向的值可以改。
int* const p2=&a;
p2=&b;//错误
*p2=100;//正确
3、const修饰指针和常量
指针的指向和指向的值都不可以该。
const int* const p3=&a;
p3=&b;//错误
*p3=100;//错误
指针和数组
作用:利用指针访问数组中的元素。
int main()
{
int arr[] = { 1,2,3,4,5 };
int* p = arr;//指向数组的指针,arr就是数组首地址
cout << "利用指针访问第一个元素:" << *p << endl;
p++;//让指针向后偏移4个字节(32位操作系统)
cout << "利用指针访问第二个元素:" << *p << endl;
cout << "利用指针变量数组:" << endl;
int* p1 = arr;
for (int i=0;i<5;i++)
{
//利用指针遍历数组
cout << *p1 << " ";
p1++;
}
system("pause");
return 0;
}
输出:
利用指针访问第一个元素:1
利用指针访问第二个元素:2
利用指针变量数组:
1 2 3 4 5
指针和函数
例:实现两个数字进行交换
#include<iostream>
using namespace std;
//值传递
void swap0(int num1, int num2)
{
int temp = num1;
num1 = num2;
num2 = temp;
}
//地址传递
void swap(int* p1, int* p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main()
{
int a = 10;
int b = 20;
swap(&a, &b);//地址传递会改变实参,而值传递不会改变实参
cout << "a=" << a << endl;
cout << "b=" << b << endl;
system("pause");
return 0;
}
值传递和地址传递的区别:
值传递:只是把实参复制传给形参,在子函数中修改形参,不会改变主函数中的实参;
地址传递:由于形参和实参表示同一个内容,在子函数中修改形参,也会改变主函数中的实参。
指针、数组、函数
案例:冒泡排序
#include<iostream>
using namespace std;
void bubbleSort(int* arr, int len)
{
for (int i = 0; i < len; 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;
}
}
}
}
void printArray(int* arr, int len)
{
for (int i = 0; i < len; i++)
{
cout << arr[i] << endl;
}
}
int main()
{
int arr[10] = { 9,5,7,3,6,4,8,1,2,0 };
//数组长度
int len = sizeof(arr) / sizeof(arr[0]);
//排序
bubbleSort(arr, len);//arr就表示数组首地址
//输出
printArray(arr, len);
system("pause");
return 0;
}