C语言指针访问数组元素
2015-06-29 16:40
411 查看
数组元素都是连续存放的,数组变量本身保存了第一个数组元素的地址,系统可以快速定位各元素所在内存,从而快速访问数组元素。
元素地址=首地址 + 数组元素类型占用字节数 * 索引
指针变量加减n时,代表将该指针的地址加减n*变量字节大小。
如果arr是数组,arr+1代表索引为1的元素地址,arr存放索引为0的元素地址, arr +1与 &arr[1]等价
如果arr是数组,*(arr+1)取索引为1的元素值,即*(&arr[1])。*(arr +1)与arr[1]等价
当两个指针变量指向同一个数组时:
两个指针变量可以比较,指向前面元素的指针小于指向后面元素的指针;
两个指针变量可以相减,返回两个指针所指数组之间元素的个数。
例子1:
输出arr存放的地址:0012FEC4
输出第一个元素的地址:0012FEC4
输出第一个元素的值:10
输出第一个元素的值:10
输出第一个元素的值:10
输出第二个元素的地址:0012FEC8
输出第二个元素的地址:0012FEC8
输出第二个元素的值:4
输出第二个元素的值:4
例子2:
arr[0]=10
arr[1]=4
arr[2]=6
arr[3]=-2
arr[4]=5
通过指针取数组后用下标取
arr[0]=10
arr[1]=4
arr[2]=6
arr[3]=-2
arr[4]=5
例子3:
10
4
6
-2
5
指针访问二维数组:
以下输出数组首地址:
输出arr的地址:0012FEA8
输出*arr的地址:0012FEA8
输出arr[0]的地址:0012FEA8
输出*arr[0]的地址:0012FEA8
输出arr[0][0]的地址:0012FEA8
输出arr[1][0]的地址:
输出arr[1]的地址:0012FEB8
输出arr[1][0]的地址:0012FEB8
输出arr +1的地址:0012FEB8
输出*(arr + 1)[0]的地址:0012FEB8
输出arr[2][3]的地址:
输出arr[2][3]的地址:0012FED4
输出*(arr + 2) +3 的地址:0012FED4
输出arr[2] + 3的地址:0012FED4
输出*(arr + 2)[3]的地址:0012FED4
指针遍历二维数组:
4, 2, 7, 11,
10, 20, -1, 5,
1, 23, 4, 9,
arr[0]表示第一个数组元素,假设内存地址为0x00010001,int占4字节,arr[0]+1获取第一个数组元素的第2个元素(0x00010005),每加1就指向下一个元素
因为数组元素是连续存放的,所以可以通过不断+1来获取下一个元素的指针。
arr表示的是二维数组,里面的元素是一维数组, +1获取的是下一个数组元素,中间间隔了一个长度为4的int型一维数组。
元素地址=首地址 + 数组元素类型占用字节数 * 索引
指针变量加减n时,代表将该指针的地址加减n*变量字节大小。
如果arr是数组,arr+1代表索引为1的元素地址,arr存放索引为0的元素地址, arr +1与 &arr[1]等价
如果arr是数组,*(arr+1)取索引为1的元素值,即*(&arr[1])。*(arr +1)与arr[1]等价
当两个指针变量指向同一个数组时:
两个指针变量可以比较,指向前面元素的指针小于指向后面元素的指针;
两个指针变量可以相减,返回两个指针所指数组之间元素的个数。
例子1:
//指针访问数组元素 //元素地址=首地址 + 数组元素类型占用字节数 * 索引 void zhizhentest2_1(){ int arr[] = {10,4,6,-2,5}; printf("输出arr存放的地址:%p\n", arr); printf("输出第一个元素的地址:%p\n", &arr[0]); printf("输出第一个元素的值:%d\n", arr[0]); printf("输出第一个元素的值:%d\n", *(arr+0)); printf("输出第一个元素的值:%d\n", *arr); printf("输出第二个元素的地址:%p\n", &arr[1]); printf("输出第二个元素的地址:%p\n", arr +1); printf("输出第二个元素的值:%d\n", arr[1]); printf("输出第二个元素的值:%d\n", *(arr +1)); }输出:
输出arr存放的地址:0012FEC4
输出第一个元素的地址:0012FEC4
输出第一个元素的值:10
输出第一个元素的值:10
输出第一个元素的值:10
输出第二个元素的地址:0012FEC8
输出第二个元素的地址:0012FEC8
输出第二个元素的值:4
输出第二个元素的值:4
例子2:
//通过数组名+数组索引获取对应元素的地址来遍历数组 void zhizhentest2_2(){ int arr[] = {10,4,6,-2,5}; int len = sizeof(arr)/sizeof(arr[0]); for(int i=0; i< len; i++){ printf("arr[%d]=%d\n", i, *(arr + i)); } printf("通过指针取数组后用下标取\n"); for(int j=0; j<len;j++){ printf("arr[%d]=%d\n", j, arr[j]); } }输出:
arr[0]=10
arr[1]=4
arr[2]=6
arr[3]=-2
arr[4]=5
通过指针取数组后用下标取
arr[0]=10
arr[1]=4
arr[2]=6
arr[3]=-2
arr[4]=5
例子3:
//通过移动指针变量来遍历数组 void zhizhentest2_3(){ int arr[] = {10,4,6,-2,5}; int len = sizeof(arr)/sizeof(arr[0]); for(int* p=arr; p< arr + len; p++){ printf("%d\n", *p); } }输出:
10
4
6
-2
5
指针访问二维数组:
void zhizhentest2_4(){ int arr[3][4]={ {4,2,7,11}, {10,20,-1,5}, {1,23,4,9} }; printf("以下输出数组首地址:\n"); printf("输出arr的地址:%p\n", arr); printf("输出*arr的地址:%p\n", *arr); printf("输出arr[0]的地址:%p\n", arr[0]); printf("输出*arr[0]的地址:%p\n", &*arr[0]); printf("输出arr[0][0]的地址:%p\n", &arr[0][0]); printf("\n"); printf("输出arr[1][0]的地址:\n"); printf("输出arr[1]的地址:%p\n", arr[1]); printf("输出arr[1][0]的地址:%p\n", &arr[1][0]); printf("输出arr +1的地址:%p\n", arr + 1 ); printf("输出*(arr + 1)[0]的地址:%p\n", &(*(arr + 1))[0]); printf("\n"); printf("输出arr[2][3]的地址:\n"); printf("输出arr[2][3]的地址:%p\n", &arr[2][3]); printf("输出*(arr + 2) +3 的地址:%p\n", *(arr +2) + 3); printf("输出arr[2] + 3的地址:%p\n", arr[2] + 3); printf("输出*(arr + 2)[3]的地址:%p\n", &(*(arr + 2))[3]); }输出:
以下输出数组首地址:
输出arr的地址:0012FEA8
输出*arr的地址:0012FEA8
输出arr[0]的地址:0012FEA8
输出*arr[0]的地址:0012FEA8
输出arr[0][0]的地址:0012FEA8
输出arr[1][0]的地址:
输出arr[1]的地址:0012FEB8
输出arr[1][0]的地址:0012FEB8
输出arr +1的地址:0012FEB8
输出*(arr + 1)[0]的地址:0012FEB8
输出arr[2][3]的地址:
输出arr[2][3]的地址:0012FED4
输出*(arr + 2) +3 的地址:0012FED4
输出arr[2] + 3的地址:0012FED4
输出*(arr + 2)[3]的地址:0012FED4
指针遍历二维数组:
void zhizhentest2_5(){ int arr[3][4]={ {4,2,7,11}, {10,20,-1,5}, {1,23,4,9} }; for(int* p = arr[0]; p < arr[0] + 12; p++){ if((p-arr[0])%4 == 0 && p > arr[0]){ printf("\n"); } printf("%d, ", *p); } printf("\n"); }输出:
4, 2, 7, 11,
10, 20, -1, 5,
1, 23, 4, 9,
arr[0]表示第一个数组元素,假设内存地址为0x00010001,int占4字节,arr[0]+1获取第一个数组元素的第2个元素(0x00010005),每加1就指向下一个元素
因为数组元素是连续存放的,所以可以通过不断+1来获取下一个元素的指针。
arr表示的是二维数组,里面的元素是一维数组, +1获取的是下一个数组元素,中间间隔了一个长度为4的int型一维数组。
相关文章推荐
- C++设计模式之工厂方法模式
- C++ GUI Qt4学习笔记(一)
- c++类的改进
- 黑马程序员——C语言之函数与手动编译执行C程序
- 双向循环链表(c++实现)
- C语言指针
- C++ const面试题和相关的解释
- 汉字字频统计程序(Python版+C语言版)
- C++静态数组和动态数组的区别
- C语言判断某个年份是否是闰年
- C++第六章 习题
- 《thinking in c++》Volume 1知识点总结(二)
- C语言逆序输出某个数字
- C++中传值参数和引用参数和指针怎样区别?
- 《thinking in c++》Volume 1知识点总结(一)
- C语言计算最大公约数
- C语言static
- 学习C++动态链接库基础知识 (主要关于QT项目)PART2
- boost::serialization学习笔记
- C++获取控制台输出