zoukankan      html  css  js  c++  java
  • 指针数组和数组指针

    指针数组和数组指针

    • 指针数组:数组的每一个元素都是指针,故所占内存的小和机子位数有关。
    • 数组指针:数组的指针,即指向一个数组的指针就是数组指针,一般对应的是二维数组。

    具体就不细说了,主要是分得清,不要弄混了,直接看下面的例子

    例子

    #include<iostream>
    
    using namespace std;
    
    int main()
    {
    	//定义数组
    	int arr1[3];
    	int arr2[3][10];
    
    	//数组指针
    	int *p1 = arr1;
    	int(*p2)[10] = arr2;
    
    	//首地址
    	cout << arr1 << " " << p1 << " " << &arr1[0] << " " << &p1[0] << endl;
    	//第二行的首地址
    	cout << arr1 + 1 << " " << p1 + 1 << " " << &arr1[1] << " " << &p1[1] << endl;
    
    	//首地址
    	cout << arr2 << " " << p2 << " " << p2[0] << " " << &p2[0][0] << endl;
    	//第二行的首地址
    	cout << arr2 + 1 << " " << p2 + 1 << " " << p2[1] << " " << &p2[1][0] << endl;
    	//arr2[1][1]的地址
    	cout << arr2[1] + 1 << " " << p2[1] + 1 << " " << &p2[1][1] << " " << &(*(*(p2 + 1) + 1)) << endl;
    
    	//指针数组,下面三种写法效果一样
    	int *(n1[10]); //指针大小32位机为4,64位机为8
    	int *(n2)[10];
    	int *n3[10];
    
    	cout << sizeof(n1) << " " << n1 << " " << n1 + 1 << " " << &n1[2] << endl;
    	cout << sizeof(n2) << " " << n2 << " " << n2 + 1 << " " << &n2[2] << endl;
    	cout << sizeof(n3) << " " << n3 << " " << n3 + 1 << " " << &n3[2] << endl;
    
    	system("pause");
    	return 0;
    }
    

    运行结果:

    区别和相关用法如上,可对比查看。

    再举个例子

    #include <iostream>
    using namespace std;
    int main()
    {
        int a[5] = { 1, 2, 3, 4, 5 };
        int *ptr = (int*)(&a + 1);
        cout << *(ptr - 1) << "	" << *(ptr - 2) << endl; // 5 4
        cout << &a + 1 << " " << *(&a + 1) << " " << &a[5] << endl;
        cout << "----------------" << endl;
        int *p = (int *)(a + 1);            //2
        cout << *p << endl;
        return 0;
    }
    

    运行结果:

    这里的数组指针指向的是一维数组,主要是&aa要分清:

    1.a是数组名,是数组首元素地址,+1表示地址值加上一个int类型的大小,如果a的值是0x00000001,加1操作后变为0x00000005*(a + 1) = a[1]
    2.&a是数组的指针,其类型为int(*)[5](就是前面提到的数组指针),其加1时,系统会认为是数组首地址加上整个数组的偏移(5个int型变量),值为数组a尾元素后一个元素的地址。

    更多

    1.指针数组与数组指针详解
    2.让你不再害怕指针——C指针详解(经典,非常详细)

    感谢阅读,如有问题,请批评指正,谢谢。
  • 相关阅读:
    冲刺二4
    第十四周总结
    大道至简阅读笔记02
    冲刺二3
    冲刺二2
    大道至简阅读笔记01
    冲刺二1
    第十三周总结
    第一阶段意见评价
    5月23日团队开发日志
  • 原文地址:https://www.cnblogs.com/clwsec/p/11518009.html
Copyright © 2011-2022 走看看