深入了解指针(part 1)

1.了解只指针的应用

(1)&用于取变量的地址,然后存入指针变量

如:

int a  = 1;
int *p = NULL;//无指向是指向NULL,防止野指针、
p = &a;

(2)*,解引用操作符,用于获取指针指向地址的值,还可以间接改变对应地址的值

如:

int a = 1;
int *p = &a;
printf("%d",*p);
*p = 2;
printf("%d",a);

2.指针类型

(1)char *类,存放字符

(2)int * 类,存放整型 

(3)float * ,存放浮点

......

任意指针类型变量在32位下为4字节,在64位下为8字节

区别在与,各个类型的可操作字符可能不一样,如int* float* long*解引用依次可操作4个字节,char* 类型 1个字节,short* 2个字节,double* 8 个字节

3.指针加减整数

根据类型的不同,加减整数跳过的体质为   n(加减的整数)*sizeof(char/int/double);

char* p的指针,执p+1,则跳过1个字节

如:

int n = 10;
int* p1 = &n;
char* p2 = &n;
printf("%p\n",&n);
printf("%p\n",p1);
printf("%p\n",p1+1);
printf("%p\n",p2);
printf("%p\n",p2+1);

4.void* 指针

void *为无返回型指针,此类指针不能进行相加减或者解引用,void的作用为接受任意类型的地址,后期如果需要调用的话需要强制性类型转换

5.const修饰指针

如对于这样一个指针

int a = 10;
int *p = &a;

进行

int const*p = &n;//const修饰的指针指向的内容,保证指针指向的内容不会被改变
//则
*p = 20;//不ok
//但
int m = 2;
p = &m;//ok

进行

int *constp = &n;//const在*的右边,则const修饰的是指针变量p本身,则指针变量的内容不能被改变
但指针指向的内容可以被改变
p = &m;//不ok
*p = 20;//ok

总结:当const在*右边时,修饰指针变量本身,该指针变量不能再指向别的变量的地址,但当前指向的地址的值是可以改变的

当const在*左边时,修饰的是指向地址的值,该值不可被改变,但该指针可以指向别的变量的地址

6.指针运算

(1)指针加减整数(上已述)

(2)指针-指针

结果为两个指针之间的元素个数

如:88

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int a[9] = { 0 };
	printf("%d", &a[8] - &a[0]);
}

结果为8

a[0]    a[1]    a[2]   a[3]   a[4]   a[5]   a[6]   a[7]   a[8]; 

^                                                                         ^

黄色所指为之间元素

(3)指针之间可以比大小

int a[] = { 1,2,3 };
int* p = a;
int sz = sizeof(a) / sizeof(a[0]);
while (p < a + sz)
{
	printf("%d ", *p);
	p++;
}
return 0;

7.野指针

由于位置位置,故不可用,应尽量避免

野指针成因

(1)指针未初始化

int *p = NULL;

(2)指针越界访问

如:

int a[3] = { 0 };
int* p = a;
for (int i = 0; i <= 3; i++)
{
	printf("%d", *(p + i));
}
return 0;

数组中无a[3],当指针p指向a[3]时,造成指针月结访问,要报错

(3)指针指向的空间被释放

8.assert断言

使用方法,assert( 。。。。。。)在assert括号内若执行不下去,系统自动报错,可以用来检测指针是否为空指针

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值