数组名是该数组首元素的地址,两者都是常量。
 
指针加一的结果是对该指针增加一个存储单元。对于数组来说,会增加到下一个元素,而不是下一个字节,这也是为什么在声明指针的时候必须声明它所指向的对象类型。
 
对指针加一,等价于对指针的值加上它指向的对象的字节大小。
 
如下等式要牢记
 
  1. data + 2 == &data[2];  
  2. *(data + 2) == data[2];  
只有在函数原型和函数定义头中,int *ar 和 int ar[]是相同的,其他情况下是不能互换使用的。
 
当我们要传递数组的时候,我们不仅传递数组名,还要传递数组的大小。
 
 
  1. #include<stdio.h>  
  2. #define SIZE 10  
  3.   
  4. int main(void){  
  5.     int marbles[SIZE]={20,10,5,39,4,16,19,26,31,20};  
  6.      long answer;  
  7.   
  8.     answer = sum(marbles,SIZE);//将数字大小当做第二个参数传递  
  9.     printf("The total number of marbles is %ld\n",answer);  
  10.     printf("The size of marbles is %u bytes.\n",sizeof marbles);//此处的marbles是一个数组,我们求出的是整个数组的字节数  
  11.       
  12.     return 0;  
  13. }  
  14. int sum(int ar[],int n){//此时的ar并不是数组,它是一个指向marbles的首元素的指针  
  15.     int i;              //此时的n是该数组的大小  
  16.                         //我们可以使用int *ar来替换int ar[]  
  17.     int total = 0;  
  18.       
  19.     for(i=0;i<n;i++){  
  20.         total += ar[i];  
  21.     }  
  22.     printf("The size of ar is %u bytes.\n",sizeof ar);指针的大小为4个字节  
  23.     return total;  
  24. }  
当我们要传递数组的时候,我们还可以使用数组的头尾指针来传递数组的大小
 
  1. #include<stdio.h> 
  2. #define SIZE 10 
  3. long sump(int *start,int *end); 
  4.  
  5. int main(void){ 
  6.     int marbles[SIZE] = {20,10,5,39,4,16,19,26,31,20}; 
  7.     long answer; 
  8.  
  9.     answer = sump(marbles,marbles+SIZE); 
  10.     printf("The total number of marbles is %ld",answer); 
  11.     return 0; 
  12.  
  13. long sump(int *start,int *end){ //end是指向的是数组最后一个元素后面的一个元素
  14.     long result = 0; 
  15.      
  16.     while(start<end){ 
  17.         result += *start++; 
  18.     } 
  19.     return result;