C语言指针pointer

1.指针的基础使用

指针的基础使用方法参见C 指针 | 菜鸟教程 (runoob.com)

基础使用例如下:

#include<stdio.h>

int main()

{

    int a = 1; //一个int常量并

    int *p;     //整型指

    p = &a;   //p指向a所在的内存空

    printf("直接a的地址:%p\n",&a);

    printf("p指向的地址:%p\n",p);

    printf("p指向地址的:%d\n",*p);

}

输出:

直接输出a的地址:0000006053FFF954

输出p指针指向的地址:0000006053FFF954

p指针指向地址的值是:1

当你想要打印指针指向的地址或者其中的值时,

打印地址:("%p", p) or ("%p", &a) 都可以

打印变量的值:("%d", *p)

 需注意的是 p = &a不能用 *p = a替换。

如果换成 *p = a 的写法,运行会报“[Done] exited with code=3221225477 ...”并且此行后面的printf什么一律不执行。这个code值貌似是代表指针访问越界,造成原因是因为有野指针存在[1]。即使不去打印野指针,也会报这行红字。

造成这个问题的原因是你一开始定义指针p的时候并没有给他赋值,本身是个野的。

而且(*p)其实是属于int类型,*p = a 这种写法的意思是:将a的值赋给p指针指向的地址, 并不是将a的地址赋给指针p,两种写法并不等价。最后就会导致p还是野指针。

好像在哪里看到说尽量养成在定义指针时顺手初始化的好习惯。[2]?

  • p = &a // 将a的地址赋给指针p
  • *p = a  // 将a的值赋给指针p指向的地址(如果指针p一开始没有赋值,会导致野指针)
  • *p = &a // 错误赋值写法, warning: assignment to 'int' from 'int *' makes integer from pointer without a cast
  • p = a   // 错误赋值写法, warning: assignment to 'int *' from 'int' makes pointer from integer without a cast

补:

这种写法好像是可以的?属于定义指针p时顺手赋值。

int a = 1;

int * p = &a; //定义指针p的时候顺手把a的地址给他是可以接受的。

[Done] exited with code=0 in 0.487 seconds

 关于空指针[2]

p 的类型是指针(int *),而*p的类型是整型(int)

当你尝试下面两种错误赋值写法时,分布会报如下warning

①*p = &a;

>> warning: assignment to 'int' from 'int *' makes integer from pointer without a cast

 ②p = a;

>>warning: assignment to 'int *' from 'int' makes pointer from integer without a cast

可以看到写法1的时候,他说你试图分配一个int型 from int *,他在训斥你试图从pointer 造(?)一个interger 。写法2的时候正好相反。

个人理解是,定义 int * p; 之后,p 的类型是指针(int *),而*p的类型是整型(int)。a属于整型,而&a作为地址属于pointer类型(?)

使用&运算符可以访问变量的地址

  • 待补

2.不同类型的指针(int *  or   char *)

不同类型的指针用来指向不同类型的变量。指针中存储的信息除了变量的地址,还包括变量的类型。(在你对指针进行++等操作时,他改变的字节数会对其类型所占字节有所反应)

void test_type_of_pointer()
{
    int a = 1;
    char b = 'A';
    int * p = &a;
    char *q = &b;
    printf("指针p指向的地址是%p\n",p);
    p++;
    printf("自加后指针p指向的地址是%p\n",p);

    printf("指针q指向的地址是%p\n",q);
    q++;
    printf("自加后指针p指向的地址是%p\n",q);
}

输出:

指针p指向的地址是00000038389FF9CC

自加后指针p指向的地址是00000038389FF9D0 (上方原地址+4字节,int类型占4个字节)

指针q指向的地址是00000038389FF9CB

自加后指针q指向的地址是00000038389FF9CC (上方原地址+1字节,因为char类型一个字节)

[1]

[C++]读取bmp文件的rgb数据及exited with code=3221225477错误处理_淡灰灰灰的博客-优快云博客https://blog.youkuaiyun.com/weixin_51717063/article/details/125501857[2]C 指针 | 菜鸟教程 (runoob.com)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值