前言

学习不复习,不如不学习,
写指针的时候有些概念模糊了,故梳理复习一下指针。

1、什么是指针?

1.1、指针就是地址,特点是任意类型的指针以整数类型存储,也就是占用4个字节

验证代码:

printf("%d\t%d\t%d\t%d\t\n", sizeof(int *), sizeof(double *), sizeof(char *), sizeof(float *));
	int *p = NULL;
	char *pp = NULL;
	double *ppp = NULL;
	printf("sizeof(int *p)=%d\n", sizeof(p));
	printf("sizeof(char *pp)=%d\n", sizeof(pp));
	printf("sizeof(double *ppp)=%d\n", sizeof(ppp));

打印结果:

c语言的c指针和java的指针一样吗 c语言指针和c++指针_c语言的c指针和java的指针一样吗

注:x64平台可能是8个字节

1.2、存放指针的变量称为指针变量
  • 1.2.1 如何定义指针?
答:类型 *变量名。
如上图int *p;char *pp;等
  • 1.2.2 如何打印指针变量?
答:以%d或者%p的形式去打印
 (整数打印或十六进制打印(地址专用))
  • 1.2.3 如何对指针变量初始化?
    答:
    1、用 NULL初始化:int *p=NULL;2、用变量的地址直接进行初始化,初始化后指针可以充当变量的使用
`int a=1; int *p=&a;  `此时输出*p就是输出a的值,*p等价a,打印 *p结果为1。
	
解释:指针就好比是一个可以去任意地方的传送门。你想回家装修,那你得先把你家地址输进去(取地址符),使用传送门就可以到家里了。

附上验证代码:

int a = 1;
	int *p = &a;
	printf("%d\t%p\t\n", p, p);//两种方法打印
	//printf("%d\t%d\t\n",*p, a);//指针充当变量的使用

打印地址结果:

c语言的c指针和java的指针一样吗 c语言指针和c++指针_c语言_02

1.2.4 所有指针都可以用NULL初始化,但不可以操作或修改NULL地址,初始化用NULL表示指针不指向任何的对象。

经典错误1:

int *p=NULL;
  *p=1;(×)//指针不指向任何对象,不可以访问值
 //error:写入位置 0x00000000 时发生访问冲突。

正确写法:

int *p=NULL;
int a=0;
p=&a;//指针修改指向,指向了变量a的地址,从而可以访问a的值
*p=1;

代码验证:

c语言的c指针和java的指针一样吗 c语言指针和c++指针_初始化_03

经典错误2:

int *p;
*p=1;(×)
//error C4700: 使用了未初始化的局部变量“p”

注: 没有指向的指针称为野指针。错误2中p没有给分配内存,内存分配有三种方式:malloc,calloc,realloc,后面会详细说一下其区别.

2、指针易错易混淆的地方:

2.1 指针的两个类型
					int *p;
			2.1.1 指针的类型   去掉变量名。
					int *p中的 int *:指针的类型
			2.1.2 指针所指向的类型:对应内存当中存储的数据类型  : 去掉变量名和*
					int *p中int:指针所指向的类型			
2.2 指针的两个原则
			2.2.1 和变量一样,使用前必须初始化原则
			2.2.2 类型一致原则: 指针的类型和指针的所指向的类型的一致性
			错误写法:
			char a = 'A';
			int *p = &a ;(×)//类型不兼容
			
2.3 指针的两个运算
			2.3.1 取值运算
				&:取地址符  &变量名:&a  --->取变量的地址
				*: 解引用符  *指针变量 :*p ---->指针变量存储的地址 对应内存中的值
			2.3.2 指针的加减运算	: 用于数组
				目的:为了操作一段连续内存,可以简化代码:
				No.1 不同类型的指针内存占用情况
				No.2p+n操作?
					实际上是: p+(sizeof(指针所指向的类型)*n)
					减法同理:p-n    //p-(sizeof(指针所指向的类型)*n)

代码验证如下:

c语言的c指针和java的指针一样吗 c语言指针和c++指针_c++_04

未完待续-------->

预告:一级指针和一维数组;
多级指针操作多维数组;
指针对字符或字符串的操作;
对void *的理解;
一些指针的妙用。