C语言指针学习(-)

一、首先理解几个概念:

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个字节的长度。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值