C语言基础教程:11 C中的指针如何“进攻”数组

3210 人浏览 | 时间: 2015-09-10 20:36:39 | 作者: 那年

    在讲过了数组和指针之后,当然要讲一下怎样通过指针去取数组的元素。当然,指针与数组的之间还有很多的其他关系,在初级教程部分这方面的讲解不会太多。废话不多说,直接奔主题。

    首先,数组嘛,客观的讲就是一组数(教科书上差不多就只这么讲的,这差不多也是一句废话),我们所要学的是计算机是如何存储这一组数的。一般情况下,数组都是存放在栈上(动态数组则是在堆上),所谓栈就是由计算机自行维护的一个内存区,编译器自行分配与回收罢了,实质上就是内存嘛,没什么神秘的。而堆呢,是由你自己维护的,这两者的区别在下一讲我会好好的说说,以消除初学者的疑虑。好了,那么数组又是如何在栈上存放的呢?恩,这的确是个好问题。定义一个数组  int temp[10] = {1,2,3,4,5,6,7,8,9,10};好了,那么我们看看实际情况吧,

看看右边的地址,看出些端倪了吧!是的,数组在栈上是顺序存储的,并且temp[0]存储在最低地址空间处,以此类推。我们在看看真实的内存情况吧,这样看的还不太好玩。

是的吧,看到了吧,其实啊,数组嘛,计算机也是将他当成诸如int类型的变量处理罢了,只是多给他预留点内存空间罢了。好了,有了上面的知识铺垫,接下来就真正意义的进入今天的主题了。怎样通过指针来访问内存元素呢?

    还记得我讲指针时讲过的指针的作用吗?指针是保存的内存空间的地址。好好想想,有了地址我们可以干什么?为所欲为!想干什么就干什么,初级外挂不就是这么搞的嘛,说多了,打住。好了,开始吧。我们让指针取得数组的首元素的地址,接下来不就可以“为所欲为”了吗?哈哈,来吧,一起来干坏事。

#include <stdlib.h>
#include <stdio.h>
int main()
{
	int temp[10]={1,2,3,4,5,6,7,8,9,10};
	int i=11;
	int *p=temp;
	printf("搞破坏之前!\n");
   	for(i=0;i<10;i++)
		printf("%d\n",temp[i]);
	i=11;
	for(;i<21;i++)
        *p++=i;
	//system("color 1c");
	printf("搞破坏之后!\n");
	for(i=0;i<10;i++)
		printf("%d\n",temp[i]);
	return 0;
}

结果如图:

    看来我们的“恶搞”成功了。恩,指针访问数组就是这么简单!真的就这么简单吗?指针如何访问二维数组呢?恩,我们来看一个简单的例子。

#include <stdlib.h>
#include <stdio.h>
int main()
{
	int temp[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
	int i,j;
	int *p=&temp[0][0];
	printf("搞破坏之前!\n");
   	for(i=0;i<3;i++)
		for(j=0;j<4;j++)
		printf("%d\n",temp[i][j]);
	i=13;
	for(;i<25;i++)
        *p++=i;
	//system("color 1c");
	printf("搞破坏之后!\n");
	for(i=0;i<3;i++)
		for(j=0;j<4;j++)
		printf("%d\n",temp[i][j]);
	return 0;
}

看看效果如何:,还不错,目标实现了。可能大家对二维数组如何在内存中“排布”还不是太清楚,没事,那是下一讲要讲的,别急。好好理解这一讲所讲的,看看指针是如何来改变内存空间中的数据的!哦,对了,指针如何访问数组元素呢?你都会用指针去改变数组数据了,难道还不会去访问数组元素吗?嘿嘿,聪明的你一定已经会了吧!恩,这讲就讲到这里。有问题  Call Me By QQ969722243


相关阅读