c语言之指针与数组

考虑该例子:

int calendar[12][31];

该语句声明了calendar是一个数组,该数组拥有12个数组元素,其中每个元素都是一个拥有31个整型元素的数组(而不是反过来理解)。因此,sizeof(calendar)的值是12*31=372与sizeof(int)的乘积。如果calendar不是用于sizeof的操作数,而是用于其他的场合,那么calendar总是被转换为一个指向calendar数组的起始元素的指针。要理解上面这句话的含义,就得先理解有关指针的一些细节。

任何指针都是指向某种类型的变量。

当 int a[3];

int *p;

若 这样写:p = a;

就会把数组a中下标为0的元素的地址自动赋给p。注意,这里我们并没有写成

p = &a;

这种写法在ANSIC中是非法的,因为&a是一个指向数组的指针,而p是一个指向整型变量的指针,它们的类型不匹配。

现在继续考虑最开始的“二维数组”,它其实是以数组为元素的数组。

几个声明如下:

int calendar[12][31];

int *ip;

int i;

其中calendar[4]的含义是什么?  因为calendar是一个有着12个数组类型元素的数组,它的每一个数组类型元素又是一个有着31个整型元素的数组,所以calendar[4]是calendar数组的第五个元素,是calendar数组中12个有着31个整型元素的数组之一。因此calendar[4]的行为也就表现为一个有着31个整型元素的行为。例如,sizeof(calendar[4])的结果是31与sizeof(int)的乘积。又如,

p = calendar[4];

这个语句使指针p指向数组calendar[4]中下标为0的元素。

如果calendar[4]是一个数组,我们当然可以通过下标的形式来指定这个数组中的元素,就像,

i = calendar[4][7];

我们也确实可以这样做。还是与前面类似的道理,这个语句可以写成下面这样而表达的意思保持不变:

i = *(calendar[4]+7);这个语句还可以表达成:

i = *(*(calendar+4)+7);

下面再看,

p = calendar;

这个语句是非法的。因为calendar是一个二维数组,即“数组的数组”,在此处的上下文中使用calendar名称会将其转换为一个指向数组的指针;而p是一个指向整型变量的指针,这个语句试图将一种类型的指针赋值给另一种类型的指针,所以这是非法的。

*********************

很显然 我们需要一种声明指向数组的指针的方法:

int (*ap)[31];

这个语句实际上是声明了*ap是一个拥有31个整形元素的数组,因此ap就是一个指向这样的数组的指针。因而,我们这样写,

int calendar[12][31];

int (*monthp)[31];

monthp = calendar;

这样,monthp 将指向calendar的第一个元素,即数组calendar的12个有着31个元素的数组类型元素之一。

假定在新的一年开始时,我们清空calendar数组,用下标形式可以轻易做到,         int month;

for(month  = 0;month < 12 ;month++){                 int day;

for(day = 0;day <31;day ++)

calendar[month][day] = 0;

}

上面的代码用指针如何表示呢?

calendar[month][day] = 0;

表示为

*(*(calendar+month)+day)= 0;

但是真正有关的部分是哪一部分呢?

如果monthp指向一个拥有31个整型的数组,而calendar的元素也是拥有一个31个整型的数组,因此我们可以使用一个指针

来遍历一个数组一样,这里我们同样可以使用指针monthp以步进的方式来遍历数组calendar:

int (*monthp)[31];

for(monthp = calendar;monthp < &calendar[12;monthp++]) /*处理一个月的情况*/

同样地,我们可以处理其他数组一样,处理指针monthp所指向的数组的元素:

int (*monthp)[31];

for(monthp  = calendar; monthp  < &calendar[12]; monthp ++){

int *dayp;

for(dayp = *monthp;dayp<&(*monthp)[31];dayp++)

*dayp = 0;

}

时间: 2024-10-22 08:16:37

c语言之指针与数组的相关文章

C语言中指针和数组

C语言数组与指针的那些事儿 在C语言中,要说到哪一部分最难搞,首当其冲就是指针,指针永远是个让人又爱又恨的东西,用好了可以事半功倍,用不好,就会有改不完的bug和通不完的宵.但是程序员一般都有一种迷之自信,总认为自己是天选之人,明知山有虎,偏向虎山行,直到最后用C的人都要被指针虐一遍. 指针 首先,明确一个概念,指针是什么,一旦提到这个老生常谈且富有争议性的话题,那真是1000个人有1000种看法. 在国内的很多教材中,给出的定义一般就是"指针就是地址",从初步理解指针的角度来说,这种

C语言使用指针表示数组的注意事项

1)数组名是指针常量 如对指针变量可以进行++运算,但是对数组名却不允许,另外,对数组名的赋值运算也是错误的 2)注意指针变量的当前值 指针变量的值在程序运行过程中可能经常改变,要对此注意 3)数组越界 C语言系统是不检查数组越界的,需要程序员自行检查 4)深入理解++和-与指针变量的结合 p++是指把指针位置增加一个单元,此时表达式的值仍为p,p的值增加 *(p++)是指读取(p++)地址的值 (*p)++是指把p指向的内存单元的值加1 同2 ++p与1类似,不过表达式的值为增加后的p *(+

【指针篇】C语言:指针与数组的区别,数组指针与指针数组的剖析。

指针就是指针,指针变量在 32位系统下,永远占 4  个byte ,其值为某一个内存的地址.指针可以指向任何地方,但是不是任何地方你都能通过这个指针变量访问到. 数组就是数组,其大小与元素的类型和个数有关.定义数组时必须指定其元素的类型和个数.数组可以存任何类型的数据,但不能存函数. 说起指针,就让我们想到数组.而数组和指针也是有区别的.指针,指的是描述一个变量的地址:我们可通过指针的偏移来指向下一个地址.数组,是描述相同元素的一个集合:数组名是常量地址,不可自加不可修改. 我们可以通过数组的下

C语言通过指针对数组元素进行排序

// //  main.c //  Pointer_array // //  Created by ma c on 15/8/2. //  Copyright (c) 2015年 bjsxt. All rights reserved. //  要求:使用指针的指针输出字符串.首先要使用指针数组创建一个字符串数组,然后定义指向指针的指针,使其指向字符串数组,并使用其输出数组中的字符串.同时对数组中的内容进行升序排序. #include <stdio.h> #include<string.h

【c语言】指针实现数组元素的移位

方案一.显示上移位,实际不发生移位.. #include<stdio.h>#include<math.h>void main(){    int a[10],i,*p,n;    n=4;    srand(time());    printf("数组:");    for(i=0;i<10;i++){        a[i]=rand()%100;        printf("%-4d",a[i]);    }    printf(

程序设计基石与实践之C语言指针和数组基础

英文出处:Dennis Kubes:  <Basics of Pointers and Arrays in C>. 关于C语言中指针和数组的争论就像是一场恶战.一方面,有些人觉得,所有人都必须承认指针与数组是不同的.而另一些人则认为数组被当成指针来处理,因此它们不应该有什么区别.这种现象让人迷惑.然而,这两种说法其实都是正确的. 数组不是指针,指针也不能说是数组.在C语言中,指针仅在内存中代表一个地址,而数组是许多连续的内存块,多个类型相似的元素存储在其中.更深入的解释,请参考我之前的博文&l

C++指针与数组

对数组地址的理解,如 int c[2] = {2,3}; int(*cp)[2] = &c; cout << &c[0] << c << cp << endl; 输出都是一样的..结论:当对数组用&比如&c,那么意思就是“对数组取地址或者取得数组的地址”,而数组的地址返回的就是第一个元素的地址,加上数组名本身也是一个指针,故c与&c会有一样的结果. 本版讨论很多对于C语言中指针和数组的认识和看法,下面是我自己对指针的一

C#委托与C语言函数指针及函数指针数组

C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用的时候通过指针访问这个函数. 在C语言中函数指针的申明如下: //可以理解为申明一个指着变量 Func ,它的类型是 返回Type(可以为 void )类型的参数,接收 (Type one,Type two,...)类型的//参数(可以不接受参数). Type *Func(Type one,Type

《C程序设计语言(第2版&#183;新版)》第5章 指针与数组

指针:保存变量地址的变量:在 C中应用广泛,因为1)指针往往是表达某个计算的唯一途径:2)使用指针往往可以写出更高效紧凑的代码:另一方面,1)指针和goto一样,会导致程序难以理解:2)粗心会很容易导致指针指向了错误的地方: 指针与数组关系密切: ANSI C明确制定了操纵指针的规则,并且使用void*代替char*作为通用指针的类型: 5.1 指针与地址 内存的组织:一系列连续编号或编址的存储单元,单元可以单个操纵也可以以连续成组的方式操纵:通常1个字节可以存放一个char,2个相邻字节可以存