指针初识-黑马c++学习

  • Post author:
  • Post category:其他




指针



1 指针的基本概念


指针的作用

:可以通过指针间接访问内存。

  • 内存编号是从0开始记录的,一般用十六进制数字表示
  • 可以利用指针变量保存地址



2 指针的定义

#include <iostream>
using namespace std;
int main(){
    int a = 10;
	//定义指针
    int *p;
	//给指针复制
    p = &a;
    cout << &a << endl;
    cout << p << endl; 
    cout << "a 的值为:" << a << endl;
    cout << "p 指向的内存保存的值为: " << *p << endl;
    cout << "指针变量所占内存大小: " << sizeof(p) << endl;
    system("pause");
}



3 指针所占内存空间

32位 4 字节

64位 8 字节

不确定,与操作系统也有关系



4 空指针与野指针


空指针

:指针变量指向内存中编号为0的空间


用途

:初始化指针变量

注意:空指针指向内存是不可访问的


示例1:空指针

int main(){
    //指针变量p指向内存地址编号为0的空间
	int * p = NULL;
	//访问空指针报错 
	//内存编号0 ~255为系统占用内存,不允许用户访问
	cout << *p << endl;
	system("pause");
	return 0;
}


野指针

:指针变量指向非法空间的内存空间


示例2:野指针

int main() {
	//指针变量p指向内存地址编号为0x1100的空间
	int * p = (int *)0x1100;
	//访问野指针报错 
	cout << *p << endl;
	system("pause");
	return 0;
}



5 const修饰指针

const修饰指针有三种情况

  1. const修饰指针 —> 常量指针
  2. const修饰常量 —> 指针常量
  3. const即修饰指针,又修饰常量
#include <iostream>
using namespace std;
int main(){
    int a = 10;
    int b = 20;
    //常量指针:可以修改指针指向的地址,不能修改指向地址的值。
    int * const pa = &a;
    *pa = 30;
    //指针常量:可以修改指向地址的值,不能修改指针指向的地址。
    const int *pb = &b;
    pb = &b;
    
    return 0;
}



6 指针和数组

利用指针访问数组中的元素


示例

int main() {
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int * p = arr;  //指向数组的指针
	cout << "第一个元素: " << arr[0] << endl;
	cout << "指针访问第一个元素: " << *p << endl;
	for (int i = 0; i < 10; i++)
	{
		//利用指针遍历数组
		cout << *p << endl;
		p++;
	}
	system("pause");
	return 0;
}



7 指针和函数


作用

:利用指针作函数参数,可以修改实参的值


示例

//值传递
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); // 值传递不会改变实参
    cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	swap2(&a, &b); //地址传递会改变实参
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	system("pause");
	return 0;
}



8 指针、数组、函数

**案例描述:**封装一个函数,利用冒泡排序,实现对整形数组的升序排序


示例:

//冒泡排序函数
void bubbleSort(int * arr, int len)  //int * arr 也可以写为int arr[]
{
	for (int i = 0; i < len - 1; i++)
	{
		for (int j = 0; j < len - 1 - i; 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] = { 4,3,6,9,1,2,10,8,7,5 };
	int len = sizeof(arr) / sizeof(int);
	bubbleSort(arr, len);
	printArray(arr, len);
	system("pause");
	return 0;
}

为什么(sizeof 数组名)可以求得整个数组的长度

#define mysizeof(L_Value) ((char*)(&L_Value + 1) - (char*)(&L_Value))

**&数组名:**表示指向数组的地址因此&L_Value + 1可以越过整个数组。