C 指针和数组的微妙关系

Submitted by dravenk on Thu, 03/30/2017 - 22:19

C 指针(pointer):
用于储存变量的地址,是一个值为内存地址的变量(或者数据对象).指针变量的值使地址.

指针类型(pointer type)可由函数类型、对象类型或不完全的类型派生,派生指针类型的类型称为引用类型。指针类型描述一个对象,该类对象的值提供对该引用类型实体的引用。由引用类型T 派生的指针类型有时称为“(指向)T 的指针”。从引用类型构造指针类型的过程称为“指针类型的派生”。这些构造派生类型的方法可以递归地应用。

一元&运算符 给出变量的存储地址,例如:
int hogu; // 定义int类型的变量 hogu
&hogu是变量的地址,地址可以理解为变量在内存中的位置.
那么&hogu就是变量在内存中的位置.

间接运算符(indirection operator)* 也称为 解引用运算符


从读开始理解C指针和数组

以一段demo为例解读C的指针声明:
int (*func_t)(float);
读作:
指向将float作为参数并且返回int的函数的指针.
下面的例子类似的:
int (*hg)(); //hg: 指向返回int的函数的指针


C 指针和数组

指针提供一种以符号形式使用地址的方法,而数组表示法是在变相地使用指针.
例如:
farray = &farray[0]; // farray数组名是该数组首元素的地址.
也就是farray&farray[0]都表示数组首元素的内存地址.
所以在表达式中,数组可以理解成"指向它的初始元素的指针"

#include <stdio.h>  
int main() {  
  int array[6];  
  int *p;  
  int i;  
  /* 给数组各元素设定值    */  
  for (i = 0; i < 6; i++) {  
    array[i] = i;  
  }  
  /* 输出数组元素值-1 */  
  p = &array[0];  
  for (i = 0; i < 6; i++){  
    printf("%d\n,", *(p + i));  // 利用指针打印数组元素的值  
  }

  /* 输出数组元素的值-2 */  
  p = array;  
  for (i = 0; i < 6; i++;) {  
    printf("%d\n", *(p + i));  
  }  
}  
  /* 输出数组元素的值-3 */  
  for (p = &array[0]; p != &array[6]; p++){  
    printf("%d\n", *p)  
  }  
}