数组与指针的操作
来源:互联网 发布:网络变压器 代工 编辑:程序博客网 时间:2024/06/05 09:33
/* ============================================================================ Name : TestArray.c Author : lf Version : Copyright : Your copyright notice Description : 数组与指针的操作 1 数组的基本知识 2 数组当做参数传递的问题 数组当做参数传递的时候,传递的是数组的指针 因为: 1 数组的拷贝很耗费资源.为了避免这种情况,C语言的编译器在传递数组时传递数组的指针 2 C语言中数组名代表了数组的首地址 3 一般来讲在传入数组时,同时将数组的长度传过去避免越界. main(int, char* [])亦是如此 参考资料: 1 http://bbs.csdn.net/topics/380157577 2 http://bbs.csdn.net/topics/380060409 Thank you very much ============================================================================ */#include <stdio.h>#include <stdlib.h>int main(void) {testArray1();testArray2();return EXIT_SUCCESS;}/** * 数组的基本知识 * 1 数组名即为数组第一个元素的首地址 * 2 *(array+1)中的+1到底是什么意思呢??? * 既然数组名即为数组第一个元素的首地址,那么 * *array就取出了第一个元素的值,为0. * 那为什么*(array+1)就去除了第二个元素的值1呢? * 在此我们注意array数组的定义: * int array[5]={0,1,2,3,4}; * 它是一个int类型的数组,里面保存的全部是int数据. * 即每个元素占四个字节. * 所以*(array+1)中的array+1表示从首地址移动了1个int的长度 * 即移动到了第二个元素的首地址. * 这样就取到了第二个元素!!!!!!!! * 概括地说:*(p+1)的+1操作到底移动多少,关键还是看p是什么类型 * 的指针 * 3 array[i]和*(array+i)等价,获取数组中的某个元素 * &array[i]和array+i等价,获取某个元素的地址 * 这是为什么呢? * 重复一下核心:核心还是在于:数组名是数组第一个元素的首地址!! * 所以获取某个元素比较"正宗"的写法是*(array+i)而array[i] * 只是它的简写. * 那么获取某个元素的地址比较"正宗"的写法是array+i而&array[i] * 只是它的简写 * 4 利用指针访问数组 * 这两种方式都行,第一种是第二种的简写 * printf("element%d = %d address=%x\n",j,p[j],&p[j]); * printf("element%d = %d address=%x\n",j,*(p+j),p+j); * 注意:这里的p是一个指针!!!它指向了数组arr的第一个元素的首地址. * 既然是一个指针,那么: * 获取第j个元素的地址就是:p+j * 获取第j个元素的数据就是:*(p+j) */void testArray1(){//1 数组名即为第一个元素的首地址int array[5]={0,1,2,3,4};printf("fisrt element address=%x\n",array); printf("===========\n"); //2 关于*(array+1)的理解,见上总结 printf("*array=%d\n",*array); printf("*(array+1)=%d\n",*(array+1)); printf("===========\n"); //3 查看每个元素的值和其地址,见上总结 int i; for(i=0;i<5;i++){ //两种方式都可以,第一种是第二种的简写 printf("element%d = %d address=%x\n",i,array[i],&array[i]); printf("element%d = %d address=%x\n",i,*(array+i),array+i); } printf("===========\n"); //4 利用指针访问数组(方式一),总结见上 //该方式采用的是下标遍历,指针是没有变化的只是在移动.比如p+j int arr[5]={9,5,2,7,0}; int *p=arr; int j; for(j=0;j<5;j++){ //两种方式都可以,第一种是第二种的简写 printf("element%d = %d address=%x\n",j,p[j],&p[j]); printf("element%d = %d address=%x\n",j,*(p+j),p+j); } printf("===========\n"); //4 利用指针访问数组(方式二),总结见上 //该方式采用的是指针遍历,指针在不断变化的,比如pointer++ int intArray[5]={5,4,3,2,1}; int *pointer; for(pointer=intArray;pointer<intArray+5;pointer++){ printf("element = %d address=%x\n",*pointer,pointer); } printf("===========\n");}void testArray2() {//所占内存大小为20个字节int array[5] = { 1, 2, 3, 4, 5 };printf("testArray2 int array[5] size=%d\n", sizeof(array));printf("===========\n");int i;for (i = 0; i < 5; i++) {printf("first array[%d]=%d\n", i, array[i]);}printf("===========\n");//把数组作为参数传递到其他的函数int length = sizeof(array) / sizeof(int);testArray3(array, length);//再次遍历观察原来的数组for (i = 0; i < 5; i++) {printf("second array[%d]=%d\n", i, array[i]);}printf("===========\n");}/** * 在函数中接收到传递过来的数组会退化成一个指针. * 于是利用该指针对原数组进行操作. */void testArray3(int array[],int length){//因为传递过来的仅仅是个指针,所以其大小为4个字节!!!!printf("testArray3 int array[5] size=%d\n",sizeof(array));printf("===========\n");int i;for (i = 0; i < length; i++) {//array[i] = array[i] + 5;*(array+i)=*(array+i)+5;}}
0 0
- 数组与指针的操作
- 数组与指针的操作
- 数组指针的指针操作
- 指针数组的操作
- 数组的指针操作
- visual studio 关于指针与数组操作的比较
- 数组与指针-下标索引操作符的交换性
- 指针数组与数组指针的使用
- 数组指针与指针数组的区别
- 数组指针与数组元素的指针
- 数组指针与指针数组的区别
- 数组指针与指针数组的区别
- 数组指针与指针数组的区别
- 数组指针与指针数组的区别
- 数组指针与指针数组的区别
- 数组指针与指针数组的区别
- 指针数组与数组指针的认识
- 指针数组 与 数组指针 的分析
- DP入门50题(4)——NYoj79 导弹拦截
- centos上用yum安装Mysql5.6
- ES学习笔记七-多字段搜索
- YT14-HDU-机器人走表格
- Spring MappingJacksonHttpMessageConverter
- 数组与指针的操作
- Codeforces Round #291 (Div. 2) ABC
- 个人学习笔记---JSP
- 一个架构师谈什么是架构以及怎么成为一个架构师
- spring中context:property-placeholder
- SharePoint 2013 入门教程 [不断更新~]
- 新学—Android开发—开博!
- (hdu step 4.3.2)Prime Ring Problem(n个数成环,输出两两之和为质数的所有情况)
- java 并发编程实战 第四天