您的位置:首页 > 其它

数组与指针的操作

2015-02-24 16:55 190 查看
/*
============================================================================
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: