您的位置:首页 > 编程语言 > C语言/C++

C++数组和函数中的指针

2015-08-25 15:16 281 查看
一、指针与数组

1、数组:数组是一段连续的空间,数组名表示空间第一个元素的地址。

2、指针:指针包含两个内容,一个是内存地址,这个大小和机器长度有关;另一个是指针类型,这个跟指针定义的类型有关。

int arr[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };

int (*p1)[3] = arr;

int (*p2)[2][3] = &arr;

int * p3 = (int *)(arr + 1); // p3[0]=4

int * p4 = (int *)(&arr + 1); // p4[-1]=6

arr是一个int(*)[3]类型,&arr是一个int(*)[2][3]类型(返回指针类型为整个数组),两者指向的地址相同。数组指针可以强制转化为指针类型(指向地址不变,只是修改了指针类型)。

上例可以看出数组名实质上也是指针,储存的地址是数组第一个元素,指针类型是除过第一维的数组指针。

arr[1]执行过程:arr[1]=*(arr+1)

二、数组指针和指针数组

1、数组指针:指向数组的指针。首先来说数组指针也是指针,只不过指针的类型是数组。例如int (*p)[3],其中()优先级大于[],表述指向一个1*3的数组指针。

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

int(*ptr)[3] = &a;

cout << ptr[0][2] << endl;

int * p=*ptr;

cout << p[2] << endl;

这里首先要注意第2行语句,对数组a取址,因为a本身是一个int*,而不是int (*p)[3],然后需要注意的就是第三行ptr[0]代表的是&a整体的地址(同理ptr+1,表示a后面sizeof(a)空间的首地址),所以访问a中第3个元素的时候需要ptr[0][2]。

2、指针数组:首先来说指针数组是一个数组,数组里面的每个元素是一个指针。例如int *ptr[3],其中[]优先级大于*

int *ptr[2];

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

int x = 5;

ptr[0] = &x;

ptr[1] = &a[2];

cout << *ptr[0] << endl;

cout << *(ptr[1]-1) << endl;

三、指针与函数

1、函数指针:可以指向函数的指针,实质是指向函数所在的内存区域

int add(int a, int b)

{

return a + b;

}

void main()

{

int(*p)(int, int);

p = add;

printf("%d\n", p(1,2));

}

2、指针型函数

函数的返回值是一个指针,这里需要注意返回的指针初始化的时候最好使用new分类内存空间,否则容易出现返回的指针指向的内存空间被释放问题。

四、总结:

1、数组名表示降第一维后的数组指针。

2、数组指针是一个指针,它指向一个数组。

3、指针数组是一个数组,它的元素是指针。

4、&a(a是一个数组)是整个数组a的地址。

5、指针数组可以强制转化为指针,其中地址不变,只改变指针类型
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: