一、首先理解几个概念:
1、指针常量、常量指针、指针变量。
关键:const关键字的含义。
(1)指针常量:指针自身不可改变;
定义:int * const p//p值一旦初始化,不可改变;
以下是在VS2015中编译:
#include "stdio.h"
int main() {
int arr[] = { 1,2,3,4,5 };
int * const p = arr;
p++;//vs2015:erro C2166: l-value specifies const object/*注释本行方可运行*/
*p = 8;//ok
printf("%d", *p);//output:8
while (1);
return 0;
}
注意语义:const修饰的是p,所以p不可改变,理所当然。(2)常量指针:指针指向的对象(内容)不可改变;
定义:int const *p = arr;//arr为地址
以下是在VS2015中编译:
#include "stdio.h"
int main() {
int arr[] = { 1,2,3,4,5 };
int const *p = arr;
p++;//ok!
*p = 8;//error C2166: l-value specifies const object /*注释本行方可运行*/
printf("%d", *p);//output:2
while (1);
return 0;
}
注意语义:const修饰的是*p,所以*p不可改变,理所当然。
注:如下,可猜到,p,和*p都不可改变。
int const * const p;
那么 数组是什么指针?
#include "stdio.h"
int main() {
int arr[] = { 1,2,3,4,5 };
int a = 8;
arr++;// error C2105: '++' needs l-value
arr = &a; //error C2106 : '=' : left operand must be l - value
}
可以看到,arr是指向常量的指针常量;如上[注]中。
(3)指针变量:指针变量是用来存放地址的变量。我们常说的指针是指针变量的简称。
定义:
int *p;
char *p;
int **p;
char **p;//等等
二、指针
指针即指针变量
以下是指针的一些概念:
(1)指针的类型。
(2)指针所指向的类型。
(3)指针的值(指针所指向的内存区)。
(4)指针本身所占内存。
int*p;
char*p;
int**p;
int(*p)[3];
int*(*p)[4];
以上是几个实例
指针的类型
从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。
int*p; //指针类型:int*;
char*p; //指针类型:char*;
int**p; //指针类型:int**;
int(*p)[3]; //指针类型:int(*)[3];
int*(*p)[4]; //指针类型:int*(*)[4];
指针指向的类型
从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型
int*p; //指针指向的类型:int;
char*p; //指针指向的类型:char;
int**p; //指针指向的类型:int*;
int(*p)[3]; //指针指向的类型:int()[3];
int*(*p)[4]; //指针指向的类型:int*()[4];
指针的值--或者叫指针所指向的内存区或地址
指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。
指针本身所占据的内存区
指针本身占了多大的内存?你只要用函数sizeof(指针的类型)测一下就知道了。在32位平台里,指针本身占据了4个字节的长度。