C语言中的指针

指针的优点:

1) 使程序更简洁、紧凑、高效

2) 有效的表达更复杂的数据结构

3)动态分配内存

4) 得到多于一个数的函数返回值

1. 概念:

地址:内存中每个字节单位都有一个编号(门牌号)

指针:指针就是地址

指针变量:用于存放地址的变量就叫做指针变量

2. 格式:

存储类型 数据类型 *指针变量名

int *p;//定义了一个指针变量p

3. 指针操作符:

&:取地址符:取变量的地址

* :取内容:取地址里面的内容

*&a = a; // *和&是互逆运算

&*a//错误(原因:运算符优先级)

4. 初始化:

指针变量在使用前不仅要定义还要初始化,未初始化的指针变量不能随便使用,会产生野指针

1. 将普通变量的地址赋值给指针变量

int a=10;

1) int * p = &a;//定义的同时赋值

2) int *p = NULL;

p = &a;//先定义后赋值

printf("%d %d\n",a,*p);//打印a的值 10 10

printf("%p %p\n",&a,p);//打印a的地址

*p = 3;//可以通过*p改变指向的内容

printf("%d %d\n",a,*p);//打印a的值 3 3

printf("%p %p\n",&a,p);//打印a的地址

2. 将数组的首地址赋值给指针变量

char s[10]="hello";

char *p = s;//指针指向数组首地址,即指向'h'

3. 将指针变量里面保存到地址赋值给另一个指针变量

float a=1.3;

float *p = &a;

float *q = p;

5.指针运算

(1) 算术运算

char s[32]="hello";

char *p = s;

p++;//指针向高地址方向移动一个数据单位,指针指向发生变化

p--;//指针向低地址方向移动一个数据单位,指针指向发生变化

p+n:访问高地址方向第n个数据的地址,指针指向不发生变化

p-n:访问低地址方向第n个数据的地址,指针指向不发生变化

偏移了多少地址(字节) = n*sizeof(数据类型)

两个地址之间的差 = 两个地址之间相隔元素的个数

p-q= 之间相隔元素的个数

(2)关系运算

> < == !=

指针之间关系运算比较的是它指向地址的高低

指向高地址的指针大于指向低地址的指针

char s[10]="hello";

char *p1 = &s[1];

char *p2 = &s[3];

p1 < p2;

注意:指向不同类型的数组指针关系运算没有意义,指向不同区域的指针关系运算也没有意义

(同一个数组间进行比较)

6.指针的大小

sizeof(指针变量名)

int a=5;

int *p1 = &a;//4

short b = 2;

short *p2 = &b;//4

double c = 3.333;

double *p3 = &c;//4

double *p4 = NULL;//4

32位操作系统:指针为4字节

8位16进制表示 ,4字节

64位操作系统:指针8字节

16位16进制表示,8字节

总结:

1.32位操作系统,指针大小4字节,64位操作系统,指针大小8字节

2.内存地址是固定的,但是变量的地址不固定的,(栈区变量随机分配)

3.指针类型根据指针指向空间的数据类型

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值