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、指针数组可以强制转化为指针,其中地址不变,只改变指针类型
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、指针数组可以强制转化为指针,其中地址不变,只改变指针类型
相关文章推荐
- C++数组和函数中的指针
- c++中类对象不能访问类的私有成员变量
- c++ ActiveX基础1:使用VS2010创建MFC ActiveX工程项目
- c++中的array数组和vector数组
- C++运行时类型识别——RTTI
- C++中各种类型的成员变量的初始化方法
- C++异常机制
- C语言切换壁纸和播放音乐
- [LeetCode] Edit Distance
- c语言中浮点数的陷阱
- C++动态链接库的兼容性
- C++中编译预处理功能
- 【more effective c++读书笔记】【第1章】基础议题(2)
- 【more effective c++读书笔记】【第1章】基础议题(2)
- 虚函数的机制
- 把C++的类的方法直接作为线程的回调函数
- C++栈学习——赋值运算法的重载
- 阿里笔试--软开C/C++
- C++ MD5加密实现
- C++ 遍历文件夹