深圳网站设计知名乐云seo,网络广告营销策略,wordpress 查看访客,sqlite 做网站数据库今天#xff0c;在我们的一个小群里#xff0c;一个同学发了一道题目给我看#xff0c;这道题目应该是C语言面试的一股清流了#xff0c;各种招聘笔试上都可以看到#xff0c;我试着发到我的大群里去#xff0c;发现有人对这个理解不是很深刻#xff0c;所以再发出来在我们的一个小群里一个同学发了一道题目给我看这道题目应该是C语言面试的一股清流了各种招聘笔试上都可以看到我试着发到我的大群里去发现有人对这个理解不是很深刻所以再发出来知识总是在不断的碰撞中提高的同理球技也是一样。大家可以先猜测一下这两个程序的输出是什么什么是指针?书籍看得比较多了这个指针那个指针但是我认为如果说到指针不说变量就有点耍流氓所以我认为理解指针的基础就要理解它是一个变量所以指针可以理解为指针变量再延伸出来就是地址变量可以存地址的一个变量而且存的这个地址指向的类型也是有要求的。#include stdio.h int main()
{ int i 12; int *p i; printf(%d\n,sizeof(int *)); printf(%d\n,sizeof(p)); printf(%p\n,p);
}看上面的代码p是一个指针变量p存的是一个地址p存的这个地址存的类型是 int 类型。有点拗口我们画个图。上图中 我们定义了一个变量 p 所以编译器就必须要给这个p分配内存如上图所示这个p的内存是 0x1000p是什么类型呢从定义可以看p的类型是 int *所以说p只可以存 int * 类型的值也就是一级指针就是一级地址也就是 i 的地址。i 也是一个变量这个变量的地址是 0x1001, 这个地址上存的值是 12。地址本来是没有名字的因为定义了变量所以地址就对应有了一个别名这个名字就代表了这个内存地址。弱弱问一句声明有没有分配内存呢什么是数组我觉得指针和数组是不用比较的我们比较的是指针变量和数组名这两个东西才有比较的意义数组是一类数据的集合指针变量只能是一个地址变量没必要折腾自己的大脑了。#include stdio.h int main()
{ int array[5] {1,2,3,4,5}; return (0);
}我们定义了一个 array的数组这个数组是个什么鬼东西我们知道内存可以起一个别名数组是连续几个同类型内存块的别名。好了我们再说下一个问题 array 是数组的名字array 获取的是这个数组的地址而且这个地址的值等于 array[0] 「首元素的地址」。虽然数值相等但是他们的含义是不一样的。如果 array 1 这个时候地址偏移的是 array sizeof(array)如果 array[0] 1 这个地址偏移是 array[0] sizeof(array[0]) 也就是偏移到地址 array[1]上。再看看上面的两个题目我们再看看上面的题目int *p (int*)(a 1);这句代码执行后p的值应该是 a sizeof(a)了。但是下面这句代码就不一样了。#include stdio.h int main()
{ int a[5] {1,2,3,4,5}; int *p a; int *q a; printf(%d %d\n,*(q1),*(p1)); return (0);
}a 赋值给 p 后这个意义就不一样了这时候它的类型是 int* p1 就是 p sizeof(int *) 。只能偏移到数组的下一个位置。所以这样说之后大家都知道上面的输出结果了吗2522扫码或长按关注回复「 加群 」进入技术群聊