老牛来学习 发表于 2020-3-8 21:07:57

C语言

本帖最后由 老牛来学习 于 2020-3-8 21:19 编辑

#include<stdio.h>

int main()
{
    int *p ;
    printf("%p",p);
}



#include<stdio.h>

int main()
{
    int *p ;
    printf("%p",*p);
}


为什么第一个能输出一个值,第二个输出不了,他们两个不是一样的吗?

指针是指向目标标量的地址,那么野指针就是没有指定地址的指针,所以现在定义一个如:int *p 或 int *p=10;其中的指针p都没有给其定义地址,所以是野指针,这句话对吗?
或者说第二种int *p = 10;把10的值给赋给指针变量p,所以他不是野指针,但是由于只指向地址0x0a所以电脑执行会报错。

小甲鱼有一个题目说str == *(str + 20) == *(20 + str) == 20
为什么相等?数组名被解释为数组的第一个地址,上式中str才是数组名,写成20直接把数组名都改了,电脑还怎么寻址呢?

wp231957 发表于 2020-3-8 21:11:58

没有初始化

4goodworld 发表于 2020-3-8 21:55:11

本帖最后由 4goodworld 于 2020-3-8 22:03 编辑

小甲鱼有一个题目说
弱弱地问一句,哪道题,我想去看看

关于第一个问题

printf("%p",*p);请问你打印的是什么%p是打印指针int*,你*p是int,东西不对等,就算打印出来,也不是你想要结果,打印不出来报错也是正常的,瞎来能搞出正确的结果吗?
另外,你不赋下值,直接拿来测试,你为啥总是能通过编译,我每次都会提醒 使用了未初始化的局部变量“p”

major_lyu 发表于 2020-3-8 22:03:38

printf的%p是以指针形式打印指针变量。打印对象需要是一个指针,也就是一个地址。
第一个打印的是p的值,p是个指针。
第二个后面给的打印对象是*p, 即打印p指向的数据,而你定义指针p之后没有让p指向任何对象。打印p指向的数据会发生段错误,即你访问的数据是不可访问的。

int *p;这个定义很明显没有给指定p到底指向哪个地址,当然是野指针。
int *p=10; 看似给p赋值,这种强制让指针指向一个地址,但你并不知道地址为10的内存中到底是什么对象,给指针一个未知的对象的地址,当然也是野指针了。

str == *(str + 20) == *(20 + str) == 20;
这个是C语言的语法决定的。前三个相等应该没有异议。第四个的寻址方式:str的地址相当于str的初始地址+20;那么20地址也就是20+str的首地址。那你说这两个值是不是一样的啊。

老牛来学习 发表于 2020-3-8 22:12:04

4goodworld 发表于 2020-3-8 21:55
弱弱地问一句,哪道题,我想去看看

关于第一个问题


S1E22第二题,str == *(str + 20) == *(20 + str) == str,这是小甲鱼的原话,但是底下有人说甲鱼打错了,应该是20【str】

4goodworld 发表于 2020-3-8 22:30:57

本帖最后由 4goodworld 于 2020-3-8 22:32 编辑

老牛来学习 发表于 2020-3-8 22:12
S1E22第二题,str == *(str + 20) == *(20 + str) == str,这是小甲鱼的原话,但是底下有人说 ...

应该是 20
如果这么写是不会出问题的
我测试下
int main()
{
        int arr = { 1,2 };
        int d = 1;
        int c = arr;
        printf("%d %d",d,c );
}
然后断点看了反汇编代码:
012C3EA6mov         eax,4
012C3EABshl         eax,0
        int d = 1;
012C3EAEmov         ecx,dword ptr
012C3EB2mov         dword ptr ,ecx
        int c = arr;
012C3EB5mov         eax,4
012C3EBAshl         eax,0
012C3EBDmov         ecx,dword ptr
两者在底层代码上是一致的,哈哈
感谢分享,让我学到新的东西!

老牛来学习 发表于 2020-3-8 22:55:33

major_lyu 发表于 2020-3-8 22:03
printf的%p是以指针形式打印指针变量。打印对象需要是一个指针,也就是一个地址。
第一个打印的是p的值,p ...

您的意思是这样写是对的吗?但是我看了运算符格式的定义,上面写应该是数组名【整型表达式】。是为啥

老牛来学习 发表于 2020-3-8 22:57:47

4goodworld 发表于 2020-3-8 22:30
应该是 20
如果这么写是不会出问题的
我测试下


但是C语言里面规定了下标运算符的用法,格式:
数组名【常量表达式】。。。
蒙圈,没学过汇编

major_lyu 发表于 2020-3-8 23:00:18

老牛来学习 发表于 2020-3-8 22:55
您的意思是这样写是对的吗?但是我看了运算符格式的定义,上面写应该是数组名【整型表达式】。是为啥

这样写是对的啊,你自己写代码验证一下就知道了。数组名[下标]这种是最容易理解的,最好这样写。那些奇怪的表达知道就行,看别人代码能看懂就可以,因为总有一些人喜欢用非主流的写法,哈哈。自己写尽量不要用,因为过段时间自己有可能都看不懂了。
页: [1]
查看完整版本: C语言