使用指针和数组
数组和指针在c .有效利用阵列紧密相连,你必须知道如何使用指针。18新利最新登入完全理解两者之间的关系可能需要几天的研究和实验,但它是值得的。
让我们从一个简单的例子开始在C数组:
广告
#定义最大10 int main () {int (MAX);int b (MAX);int我;(我= 0;我< MAX;我+ +)[我]=;b =一个;返回0;}
输入此代码并试图编译它。你会发现C将不会编译它。如果你想复制一个成b,你必须输入类似如下:
(我= 0;我< MAX;我+ +)b[我]=[我];
或者,更简洁:
(我= 0;我< MAX;b[我]=[我],我+ +);
更好的是,使用memcpy实用程序在string.h。
数组变量C是不同寻常的一个和b不是,从技术上讲,数组本身。相反,他们是永久性的指向数组的指针。一个和b永远指向数组第一个元素各自的——他们的地址一个[0]和b [0]分别。因为它们是永久你不能改变地址的指针。该声明a = b;因此不工作。
因为一个和b是指针,你可以用指针和数组做一些有趣的事情。例如,下面的代码:
#定义最大10空main () {int (MAX);int我;int * p;p =一个;(我= 0;我< MAX;我+ +)[我]=;printf (" % d \ n”* p);}
该声明p =一个;因为工作一个是一个指针。从技术上讲,一个指向数组的实际第0个元素的地址。这个元素是一个整数,所以一个是一个指针指向一个整数。因此,声明p作为一个指针指向一个整数,它等于一个的工作原理。另一种方式说同样的事情将会取代p =一个;与p =和[0];。自一个包含的地址一个[0],一个和和[0]意思是一样的。
现在,p是指向第0个元素的一个,你可以做一些奇怪的事情。的一个变量是一个永久的指针,不能改变,但是p不受这些限制。使用C实际上鼓励你移动它指针的算术。例如,如果你说p + +;,编译器知道p指向一个整数,所以这种说法的增量p适当的字节数将它移动到下一个元素的数组。如果p指向一个100字节的数组——长结构,p + +;将p由100字节。C照顾的细节元素的大小。
你可以复制到数组中一个成b使用指针。下面的代码可以替代(因为我= 0;我< MAX;一个[我]= b[我],我+ +);:
p =一个;q = b;(我= 0;我< MAX;我+ +){* q = * p;q + +;p + +;}
你可以把这段代码如下:
p =一个;q = b;(我= 0;我< MAX;我+ +)* q + + = * p + +;
并可以进一步简化:
(p =, = b,我= 0;我< MAX;* q + + = * p + +我+ +);
如果你超出数组的结束一个或b的指针p或问吗?C不在乎——它快活地沿着递增p和问,复制了其他变量。你需要小心当索引数组在C语言中,因为C假设您知道自己在做什么。
你可以通过数组等一个或b一个函数在两种不同的方式。想象一个函数转储接受一个整数数组作为参数,将数组的内容打印到stdout。有两种方法的代码转储:
空白转储(int [], int nia) {int我;(我= 0;我< nia;我+ +)printf (" % d \ n”,[我]);}
或者:
空白转储(int * p, int nia) {int我;(我= 0;我< nia;我+ +)printf (" % d \ n”, * p + +);}
的nia(number_in_array)变量是必需的,这样数组的大小。请注意,只有一个指针数组,而不是数组的内容传递给函数。还要注意,C函数可以接受适应可变数组作为参数。