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)