数组(array)是一系列具有相同类型的数据的集合,每一份数据叫做数组元素(element)。数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存。
定义数组时,要给出数组名和数组长度,数组名可以认为是一个指针,它指向数组的第0个元素。在c语言中 我们将0个元素的地址称为数组的首地址。
int arr[]={99,15,100,888,252}
首先数组名和数组首地址并不总是等价。
以指针的方式遍历数组元素:
#include <stdio.h>
int main(){
int arr[]={99,15,100,888,252};
int len=sizeof(arr)/sizeof(int); //求数组长度
int i;
for(i=0;i<len;i++){
printf("%d ",*(arr+i));// *(arr+i)等价于arr[i]
}
printf("\n");
return 0;
}
代码中 sizeof(arr)会获得整个数组所占字节数,sizeof(int)会获得一个数组元素所占用的字节数,他们相除的结果是数组包含数组个数,即数组长度
*(arr+i)表达式指向数组第0个元素,数组首地址。
我们接下来定义一个指向数组的指针,如
int arr[]={9,15,100,888,122};
int *p=arr;
arr 本身就是一个指针,所以可直接赋值给指针变量p。arr、p、&arr[0] 三种写法是等价的,都指向数组第0个元素,或说是数组的开头。
如果一个指针指向了数组,我们称他为数组指针(array pointer)。
数组指针指向的是数组中的一个具体元素,而不是整个数组,所以数组指针的类型和数组元素的类型有关,在例子中,p指向的数组元素是int类型,所以p的类型必须是int*。
反过来想,p并不知道它指向的是一个数组,p只知道它指向的是一个整数,究竟如何使用p取决于程序员的编码。更改代码 使用指针遍历
#include <stdio.h>
int main(){
int arr[]={99,15,100,888,252};
int len=sizeof(arr)/sizeof(int); //求数组长度
int i;
for(i=0;i<len;i++){
printf("%d ",*(p+i));
}
printf("\n");
return 0;
}
关于数组指针的谜题
假设p 是指向数组arr中第n个元素的指针,那么*p++、*++p、(*p)++分别是什么意思
*p++等价于*p(++),表示先取得第n个元素的值,再将p指向下一个元素。
*++p等价于*(++p)会先进行++p运算,使得p的值增加,指向下一个元素,整体上相当于*(p+1),所以会获得第n+1个数组元素的值
(*p)++ 会先取得第n个元素的值,再对该元素的值加1。假设p指向第0个元素,并且第0个元素的值为99,执行完该语句后,第0个元素的值就会变为100.
定义数组时,要给出数组名和数组长度,数组名可以认为是一个指针,它指向数组的第0个元素。在c语言中 我们将0个元素的地址称为数组的首地址。
int arr[]={99,15,100,888,252}
首先数组名和数组首地址并不总是等价。
以指针的方式遍历数组元素:
#include <stdio.h>
int main(){
int arr[]={99,15,100,888,252};
int len=sizeof(arr)/sizeof(int); //求数组长度
int i;
for(i=0;i<len;i++){
printf("%d ",*(arr+i));// *(arr+i)等价于arr[i]
}
printf("\n");
return 0;
}
代码中 sizeof(arr)会获得整个数组所占字节数,sizeof(int)会获得一个数组元素所占用的字节数,他们相除的结果是数组包含数组个数,即数组长度
*(arr+i)表达式指向数组第0个元素,数组首地址。
我们接下来定义一个指向数组的指针,如
int arr[]={9,15,100,888,122};
int *p=arr;
arr 本身就是一个指针,所以可直接赋值给指针变量p。arr、p、&arr[0] 三种写法是等价的,都指向数组第0个元素,或说是数组的开头。
如果一个指针指向了数组,我们称他为数组指针(array pointer)。
数组指针指向的是数组中的一个具体元素,而不是整个数组,所以数组指针的类型和数组元素的类型有关,在例子中,p指向的数组元素是int类型,所以p的类型必须是int*。
反过来想,p并不知道它指向的是一个数组,p只知道它指向的是一个整数,究竟如何使用p取决于程序员的编码。更改代码 使用指针遍历
#include <stdio.h>
int main(){
int arr[]={99,15,100,888,252};
int len=sizeof(arr)/sizeof(int); //求数组长度
int i;
for(i=0;i<len;i++){
printf("%d ",*(p+i));
}
printf("\n");
return 0;
}
关于数组指针的谜题
假设p 是指向数组arr中第n个元素的指针,那么*p++、*++p、(*p)++分别是什么意思
*p++等价于*p(++),表示先取得第n个元素的值,再将p指向下一个元素。
*++p等价于*(++p)会先进行++p运算,使得p的值增加,指向下一个元素,整体上相当于*(p+1),所以会获得第n+1个数组元素的值
(*p)++ 会先取得第n个元素的值,再对该元素的值加1。假设p指向第0个元素,并且第0个元素的值为99,执行完该语句后,第0个元素的值就会变为100.