(七)指针

1、基本概念

地址:内存的基本单元是字节,每个字节都有一个编号,这个编号就称为地址

指针:地址就是指针
指针变量:专门用来存放地址的变量
定义:存储类型 数据类型 *指针变量名;
存储类型:指针变量的存储类型
数据类型:指针变量所指向的变量的数据类型
指针的类型:数据类型*
&:地址运算符
*:取指针变量所指向的变量的内容

指针在内存当中的大小都为4字节(32位操作系统)

2、指针变量的初始化及赋值

int *p = &a;
空指针:可以用来表明该指针当前并未指向任何对象
int *p = NULL; //此时p为空指针
野指针:先赋值,再使用
int *p; //p为野指针
*p = 5; //error

int a = 10;
*p = &a;
#include<stdio.h>
void main()
{
	int i = 3;
	int* p = &i;
//	p = &i;
	void *pointer = NULL;
	float j = 3.14;
	double k = 89.78;
	char a = 'a';
	pointer = &j;
	pointer = &k;
	pointer = &a;
	*p = 20;
	printf("p=%p,&i=%p,i=%d\n",p,&i,i);
	return ;
}


3、二级指针:指针的指针
定义:存储类型 数据类型 **指针变量名

4、指针的运算
实质上就是地址的算术运算
p+n:向地址增大的方向移动了n个数据
地址值的变化:p+n*sizeof(数据类型),其中数据类型指的是指针变量指向的变量的数据类型
p-n:向地址减小的方向移动了n个数据
地址值的变化:p-n*sizeof(数据类型)
p++/++p:p向地址增大的方西移动了一个数据
地址值的变化:p+sizeof(数据类型),其中p的值为没有自加之前的值
p--/--p:p向地址减小的方向移动了一个数据
地址值的变化:p-sizeof(数据类型),其中p的值为没有自减之前的值
p-q:两指针相减,结果为两指针之间相隔的数据的个数
值的变化:(p-q)/sizeof(数据类型)
指针的算术运算用在数据连续存储时才有意义

指针的关系运算:if(NULL==p)或者if(p!=NULL)

5、const修饰的指针:左数右指
const int *p = &a; // *p不能被修改,p可以被修改,a可以被修改
int *const p = &a; // *p可以被修改,p不能被修改,a可以被修改
const int *const p = &a; //*p不能被修改,p不能被修改,a可以被修改

void:void修饰的指针在使用之前,必须要进行强制类型转换
void a; //系统不知道要分配多大的内存给a,所以void不能修饰普通变量

6、指针与一维数组
int a[ 10 ];
int *p = a;
当数组名a遇到*或&可以当作变量来用
a[ i ] 、*(p+i)、*(a+i)和p[ i ]具有完全相同的功能:访问数组第i+1个数组元素,但是a和p本质上是不同的,p是地址变量,a是地址常量
a、&a[0][0]、a [0]、都是a[0][0]的地址,他们的值是一样的
a+1与(int *)(a+1)加1后移动的长度不一样,(a+1)+1移动1行,而(int *)(a+1)+1移动一个元素

char str[] = “hello world”; // 字符串存放在栈区
char *p = str;

char *q = “hello world”; //字符串存放在字符串常量区

#include<stdio.h>
int main()
{
	int a[10]={1,2,3,4,5,6,7,8,9,0};
	int *p = NULL;
	p = a;
	printf("&a[0]=%p,a=%p,a+1=%p,a+2=%p\n",&a[0],a,a+1,a+2);
	printf("a[0]=%d,*a=%d,a[1]=%d,a[2]=%d\n",a[0],*a,*(a+1),*(a+2));
	printf("&a[0]=%p,&a[1]=%p\n",p,p+1);
	printf("a[0]=%d,a[5]=%d\n",*p,*(p+5));
	printf("p[0]=%d,p[5]%d\n",p[0],p[5]);
	return 0;
}
指针与二维数组
#include<stdio.h>
int main()
{
	int a[2][3]={1,2,3,4,5,6};
	printf("a=%p,a[0]=%p,a[0]+1=%p,a[1]=%p\n",a,a[0],a[0]+1,a[1]);
	printf("*a=%p,a[0][1]=%d,*(a+1)=%p\n",*a,*(a[0]+1),*(a+1));
	printf("a[1][0]=%d,a[1][0]=%d,a[0][0]=%d\n",*(*(a+1)),*(a[1]+0),*(*a));

	return 0;
}

7、指针数组
数组元素为指针的数组;
int *p[3];

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值