数组与指针的操作

简介: /* ============================================================================ Name : TestArray.
/*
 ============================================================================
 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;
	}
}



相关文章
|
1月前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
38 3
|
1月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
1月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
1月前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
1月前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
1月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
60 4
|
1月前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
50 2
|
1月前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
40 1
|
2月前
|
存储
如何使用指针数组来实现动态二维数组
指针数组可以用来实现动态二维数组。首先,定义一个指向指针的指针变量,并使用 `malloc` 为它分配内存,然后为每个子数组分配内存。通过这种方式,可以灵活地创建和管理不同大小的二维数组。
|
2月前
|
存储
如何通过指针数组来实现二维数组?
介绍了二维数组和指针数组的概念及其区别,详细讲解了如何使用指针数组模拟二维数组,包括定义与分配内存、访问和赋值元素、以及正确释放内存的步骤,适用于需要动态处理二维数据的场景。