【学习笔记】C++指针&指针的移动,和数组关系,多重指针&多重指针数组

时间:2025-05-09 08:17:32

目录

1.定义指针

2.特殊指针

修饰指针

4.指针访问数组

5.指针与函数结合实例

6.指针的移动,和数组关系

7.多重指针&多重指针数组



1.定义指针

语法

1.数据类型 * 指针名称 =&变量;

2.指针名称 =&变量;

*p代表的就是指针地址所指向的变量

指针的地址:&p

#include <iostream>
#include <string>
using namespace std;

int main()
{

    int a = 100;
int b =300;

    cout << a << endl;

    int *p = &a; //初始化指针

    cout  <<"a="<< a << endl;

    cout << "p=" << p << endl;

    cout << "*p=" << *p << endl;

    p = &a;

    cout << "p=" << p << endl;

    cout << "*p=" << *p << endl;

    *p=200;

    cout  <<"a="<< a << endl;

    cout  <<"&*p="<< &*p << endl;//变量a的地址
    cout  <<"&p="<< &p << endl;//指针的地址

    system("pause");

    return 0;
}

2.特殊指针

空指针:int *p =NULL;

野指针:为被声明的内存地址,不可访问。

修饰指针

常量指针:const int *p =&a;

指针指向的对象可以更改

指针指向的不可更改

指针常量 int * const p =&a;

指针指向的对象不可以更改

指针指向的可更改

4.指针访问数组

#include <iostream>
#include <string>
using namespace std;

int main()
{
    int arr0[] = {1, 2, 3, 4, 5};
    double arr1[] = {1.1, 2.1, 3.1, 4.1, 5.1};

    int *p = arr0; //数组名就是第一个元素的地址,不用&

    double *p2 = arr1;

    cout << "*p=" << *p << "  arr0[0]=" << arr0[0] << endl;

    p++;//移位4字节

    cout << "*p=" << *p << "  arr0[1]=" << arr0[1] << endl;

    cout << "*p2=" << *p2 << "  arr1[0]=" << arr1[0] << endl;

    p2++; //指针移位会按照不同类型进行移位 移位8字节

    cout << "*p2=" << *p2 << "  arr1[1]=" << arr1[1] << endl;
//不同指针的类型占用空间一样
    cout << "sizeof p=" << sizeof(p) << endl;
    cout << "sizeof p2=" << sizeof(p2) << endl;

    cout << "sizeof *p=" << sizeof(*p) << endl;

    cout << "sizeof *p2=" << sizeof(*p2) << endl;

    cout << "arrdess of=arr1[0]" << arr1 << endl;

    cout << "arrdess of=arr1[1]" << &arr1[1] << endl;

    cout << "value of p2" << p2 << endl;

    system("pause");

    return 0;
}

5.指针与函数结合实例

#include <iostream>
#include <string>
using namespace std;

void bubbleSort(int *p, int arr_length);

int main()
{
    int arr0[] = {10, 6, 7, 4, 5, 6, 8, 7, 6, 45, 52, 4}; //函数传递数组的实质其实就是指针

    bubbleSort(arr0, sizeof(arr0) / sizeof(arr0[1]));

    system("pause");
    return 0;
}

void bubbleSort(int *p, int arr_length) //int *p 和 int p[] 等价
{
    for (int i = 0; i < arr_length - 1; i++)
    {

        for (int j = 0; j < arr_length - i - 1; j++)
        {
            if (p[j] > p[j + 1])
            {
                int temp = p[j];
                p[j] = p[j + 1];
                p[j + 1] = temp;
            }
        }

        /* code */
    }

    for (int i = 0; i < arr_length; i++)
    {
        cout << p[i] << " ,";
    }
    cout << endl;
}

6.指针的移动,和数组关系

指针与数组的关系,C语言指针和数组的关系详解

数组和指针的关系(区别)详解

C语言数组指针(指向数组的指针)

int arr[] = { 99, 15, 100, 888, 252 };
int *p = arr;

arr 本身就是一个指针(严格来说应该是“arr 被转换成了一个指针”,可以直接赋值给指针变量 p。arr 是数组第 0 个元素的地址,所以int *p = arr;也可以写作int *p = &arr[0];。也就是说,arr、p、&arr[0] 这三种写法都是等价的,它们都指向数组第 0 个元素,或者说指向数组的开头。如果一个指针指向了数组,我们就称它为数组指针(Array Pointer)。

数组在内存中只是数组元素的简单排列,没有开始和结束标志,在求数组的长度时不能使用sizeof(p) / sizeof(int),因为 p 只是一个指向 int 类型的指针,编译器并不知道它指向的到底是一个整数还是一系列整数(数组),所以 sizeof(p) 求得的是 p 这个指针变量本身所占用的字节数,而不是整个数组占用的字节数。

也就是说,根据数组指针不能逆推出整个数组元素的个数,以及数组从哪里开始、到哪里结束等信息。不像字符串,数组本身也没有特定的结束标志,如果不知道数组的长度,那么就无法遍历整个数组。

在 C++ 中,当给一个指针添加一个值的时候,实际上添加的值是把这个值乘以指针引用的数据类型的大小。换句话说,如果给 numbers 加 1,实际上就是给 numbers 加上 1Xsizeof(short);如果给 numbers 加 2,实际上就是给 numbers + 2Xsizeof(short),以此类推。在 PC 上,这意味着以下说法是真实的,因为 short(短整数)通常使用 2 个字节:

  • *(numbers +1)是指地址 numbers + 1X2 处的值。
  • *(numbers + 2)是指地址 numbers + 2X2 处的值。
  • *(numbers + 3)是指地址numbers + 3X2 处的值。

以此类推。

假设 p 是指向数组 arr 中第 n 个元素的指针,那么 *p++、*++p、(*p)++ 分别是什么意思呢?

*p++ 等价于 *(p++),表示先取得第 n 个元素的值,再将 p 指向下一个元素,上面已经进行了详细讲解。

*++p 等价于 *(++p),会先进行 ++p 运算,使得 p 的值增加,指向下一个元素,整体上相当于 *(p+1),所以会获得第 n+1 个数组元素的值。

(*p)++ 就非常简单了,会先取得第 n 个元素的值,再对该元素的值加 1。假设 p 指向第 0  个元素,并且第 0 个元素的值为 99,执行完该语句后,第 0  个元素的值就会变为 100。

7.多重指针&多重指针数组

多重指针


#include <iostream>

using namespace std;



int main() {

	int a[5]={0,1,2,3,4};

	int *arr=a;

	int **p_arr;

	p_arr = &arr;

	
cout<<sizeof(p_arr)<<endl;

cout<<sizeof(arr)<<endl;

	cout<<p_arr<<endl;//变量保存arr地址

	cout<<&arr<<endl<<endl;



	cout<<*p_arr<<endl;//数组a的首地址

	cout<<arr<<endl;

	cout<<a<<endl<<endl;


	cout<<p_arr[1]<<endl;//arr[1]的地址

	cout<<&a[1]<<endl<<endl;//数组a【1】的地址



	cout<<p_arr[0]<<endl;

	cout<<&arr[0]<<endl;

	cout<<&arr[1]<<endl<<endl;


	cout<<*p_arr[0]<<endl;
	cout<<arr[0]<<endl;

	cout<<arr[1]<<endl;


	system("pause");

	return 0;
}

多重指针数组

#include <iostream>

using namespace std;

int main()
{

	int a[5] = {0, 1, 2, 3, 4};

	int *arr[2] = {&a[0], &a[1]};

	int **p_arr;

	p_arr = arr;

	cout << sizeof(p_arr) << endl;

	cout << sizeof(arr) << endl; //arr为int型数组
cout<<"arr数组的首地址"<<endl;
	cout << p_arr << endl; //arr数组的首地址
	cout << &arr[0] << endl;
	cout << &arr << endl
		 << endl;

cout<<"数组a的首地址"<<endl;
	cout << *p_arr << endl;//数组a的首地址
	cout << arr[0] << endl;
	cout << a << endl
		 << endl;

cout<<"数组arr[1]的地址"<<endl;
	cout << &p_arr[1] << endl;
	cout << &arr[1] << endl
		 << endl;

cout<<"数组a[1]的地址"<<endl;
	cout<<p_arr[1]<<endl;
	cout<<arr[1]<<endl;
	cout<<&a[1]<<endl<<endl;
		
cout<<"数组a[0]的值"<<endl;
	cout << *p_arr[0] << endl;
	cout << *arr[0] << endl;
	cout << a[0] << endl;

	system("pause");

	return 0;
}