指針數組和數組指針


指針數組和數組指針

  • 指針數組:數組的每一個元素都是指針,故所占內存的小和機子位數有關。
  • 數組指針:數組的指針,即指向一個數組的指針就是數組指針,一般對應的是二維數組。

具體就不細說了,主要是分得清,不要弄混了,直接看下面的例子

例子

#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) << "\t" << *(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指針詳解(經典,非常詳細)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM