指针 const关键字

来源:互联网 发布:js时间格式化为时间戳 编辑:程序博客网 时间:2024/06/08 11:52

指针

Ubuntu下 32位的 p指针 4字节
Linux下 64位的 p指针 8字节

* 和 &

int *p;

两层含义:
1定义了一个int*型的指针变量p
2 p指向的是一个int型的数据

p = &a

&a是int*类型的,把指针p和变量a进行了绑定。

*p = 23

指针的解引用,*p就得到了变量a,将23赋给变量a。
int *p1 = &a ; 定义指针的同时并且初始化

int *p1,p2定义了什么变量?

这个语句定义了一个int * 型的p1指针和一个int型的数据p2,*只管一个。

指针的初始化写零

为了养成良好的写代码的习惯,避免野指针的出现,我们在定义一个指针的时候最好把他写零,以免访问到我们不需要的错误的数据,int *p = NULL ;
NULL是编译器自带的一个宏定义,在预处理过程中被展开为 int p = ((void )0);

(1)下面来看一个程序:

这里写图片描述
&a是int * 类型的 所以要强制类型转化成char *类型的。
指针p的类型是char *类型的 指针每+1就偏转一个sizeof(char)(一个字节)的大小,所以打印出来的结果是12 34 56 78.
这里写图片描述

(2)下面这段代码的输出结果是什么? 2&7

int arr[7] = {1,2,3,4,5,6,7};
//强制类型转化
int * ptr = (int*)(&arr+1);
//此时指针指向数组的最后一位的下一位
//输出首地址首元素加1的地址的数据 输出指针-1之后指向的数据
printf(“%d,%d”,* (arr+1),* (ptr-1));

(3)编写一个写1的函数

1、(2分)按要求完成一个程序:
int main(void)
{
char a = 0;
/*自定义你的函数名,要求:
1、调用函数完成后,a的值变为1;
2、a的改变不能通过返回值
*/
printf(“a = %d.\n”, a);
return 0;
}
编写程序如下:
a的值通过调用func发生了改变!
这里写图片描述

* p++, * (p++) * ++p和( * p)++的区别

我们通过代码来查看这些的区别
这里写图片描述
++和*的优先级是一样的,所以按照从左到右的顺序来进行运算。


const

const 关键字 常量不能更改
const int a = 23
此时的a是常量,不能修改
const 修饰的是变量,但是没有影响其存储的方式,a的值还是在栈里面存放的。(在c++里面对const做了补充,const用来标识常量)
这里写图片描述
要修改的话用指针来改 一般的改可以成功 但是有警告
int *p = &a
*p = 34
这里写图片描述
如果想要没有警告 就要强制类型转换
int * p = (int * )&a;(把&a转换成了int*类型)
*p = 34

宏和const的区别?

1.编译时刻不同,宏属于预编译 ,const属于编译时刻2.宏能定义代码,const不能,多个宏对于编译会相对时间较长,影响开发效率,调试过慢,const只会编译一次,缩短编译时间。3.宏没有类型,const有类型4.define宏仅仅是展开,有多少次地方使用,就展开多少次,不会分配内存 const常量会在内存中分配

看下面几个的区别:
(1)int const *p1;
p1 = &a;
*p1 = 11;(第二句出现报错,不能赋值)
const修饰*p,*p指向指针p1指向的空间a,不能通过*p1来改变a的值,a是变量,a的值还是可以改变的。

(2)const int *p2;
同第一个是一样的第二句出现报错,const修饰的int,p2指向的是int型变量,p2指向的a不能改变,不能用*p2改变。

(3)int *const p3
const修饰的是p3,也就是说p3不能更改,p3不能++,p3地址不可以更改,但是p3所指向的内容是可以改变的

(4)const int* const p4
两者都是不可以更改的,必须定义的时候对两者都进行初始化。

const修饰函数的参数时,代表的是函数的输入型参数。
函数的输出型参数 : 指针

例题:查看下面代码是否正确?
int a = 100;
const int*b = &a;
*b=200;
错误
因为const修饰的是int
*b指向的是一个int型的数据,这个int型的数据是不可以被修改的。

原创粉丝点击