Post on: 2024-9-24Last edited: 2024-11-4Words 00 min

type
status
date
slug
summary
tags
category
icon
password

C语言指针

 
记录近期学习的C语言,可能不是很深入
 

第一部分

 
int *p 声明一个integer类型的指针
p=&a 将a的地址赋值给p
print(*p)解引用 获取 指针p 指向的地址 的值
*p=12 为指针p赋新值12
 
运行结果:
 
 
int a 声明integer类型的变量a
int *p 声明integer类型的指针p
p=&a 将a的地址赋给p
打印p会造成野指针,因为变量a并没有被初始化,没有赋值
print(*p)为0 还是因为未初始化,结果不确定,可能是任何值
 
运行结果
 
 
定义integer类型变量a
定义integer类型指针p
a初始化为10
a的地址赋值p
打印p的地址
指针p的值为10,即指针p根据a的地址获取值10
 
声明int类型变量b并初始化为20
将b赋值给指针p即为20
打印指针p的地址和上面一样
但是 打印指针p的值为20 因为赋给了b的值
 
运行结果
 
 
 
 
唯一值得说的是最后一句:如果p的地址是1,那p+1并不是1+1=2,而是5,因为指针p是integer类型,大小为4个字节。
 
第一部分写到这里,未完待续…
 
ok,继续
 

第二部分

 
 
 
定义integer类型变量 a
integer类型指针p
将p强制类型转换为char类型的指针,并将其赋值给p0
打印char大小
打印p0地址和解引用p0
打印p0+1,以及解引用p0+1
 
运行
 
1)值得关注的是printf("address= %d,value is %d\n", p0, *p0),p0解引用的值为1,原因即为注释的内容,指针p原本为integer类型,强制类型转换为char类型会导致精度丢失,integer类型大小为4字节,char类型大小为1字节,十进制1025转换成二进制为00000000 00000000 00000100 00000001,所以解引用的值为00000001,十进制为1
 
2)第二个是printf("address= %d,value is %d\n", p0 + 1, *(p0 + 1)),打印结果分别为地址值和4,解引用等于4是因为char类型的p0+1,获取第二部分字节的值,即00000000 00000000 00000100 00000001(加粗部分),转换为十进制为4
 

第三部分

 
 
 
有点麻烦,不想动脑。。 有缘再写
 
 
明日继续
鸽了一天,继续
 
上面那个剩下的:
 
声明x并初始化为5,
声明指针变量p并赋值为x的地址
通过指针变量p修改了x的值为6
//多级指针声明和赋值
声明指针q指向p
声明指针r指向q
4句打印语句
三级指针r修改x的值为10
打印
二级指针q修改x的值为*p+2 就是8
打印
 
结果:
 
 
 

第四部分

 
 
运行结果:
 
 
这部分主要是通过指针访问数组
 
打印语句:
1.打印A,A为数组名 打印的结果是第一个元素的地址
2.打印&A[0],数组第一个元素的索引为0 和第一句结果一样
3.这句打印的是第一个元素的值
4.通过指针访问首元素的值(解引用)
 

第五部分

 
 
打印结果:
 
 
数组C包含 J,O,H,N和\0(结尾),所以大小为5
strlen函数返回字符串长度不包含\0 所以长度为4
 

第六部分

 
  • print 函数使用一个 while 循环来遍历字符数组中的每个字符,直到遇到字符串的结束符 '\0'
  • 在循环中,通过指针 c 和索引 i 访问数组中的每个字符,并使用 printf 函数打印出来。
  • 循环结束后,打印一个换行符 \n
 
打印结果:
 
大概就是这些,想到再加…
 

Loading...
国庆七天乐

🎆国庆七天乐


漫谈(二)

🗯️漫谈(二)

胡思乱想