指针是C的灵魂,才算掌握了,C,内存中的栈是开口向下的

日期:2020-06-02 16:30:33   来源:互联网   编辑:小狐   阅读人数:374

指针是C的灵魂,才算掌握了,C,内存中的栈是开口向下的(图1)

学习C肯定会碰到指针,指针是C的灵魂。所以学好指针很关键,这里写一些指针方面的容易错的或者易混淆的知识点还有自己不会的盲点,以便之后复习时用。

数组传参和数组形参

1.1 数组传参

如果函数遇到数组传参的,不论是什么形式的形参,只要是数组,那么被调函数都将这个形参都当做指针来使用。

include “stdio.h”

PrintArray(int *a, int num){int i;for (i = 0; i < num; i++){printf(“%5d” a【i】;}printf(“n”;}

int main(void)

int a = { 3,4,5,6,7,7,8 }。

int num = sizeofa / sizeofa【0】;PrintArraya, num

system“pause”。

一般我们使用数组传参。

下面还有一种形参表示方法也很常用,效果其实是一样的。

include “stdio.h”PrintArray(int *a, int num){int i;for (i = 0; i < num; i++){printf(“%5d” a【i】;}printf(“n”;}

PrintArray1(int a, int num)int i;for (i = 0; i < num; i++)printf(“%5d” ai;printf(“n”;int main(void)

int a = { 3,4,5,6,7,7,8 }。

int num = sizeofa / sizeofa【0】;PrintArraya, num

PrintArray1a, numsystem“pause”。

甚至还有一种方法:

include “stdio.h”PrintArray(int *a, int num){int i;for (i = 0; i < num; i++){printf(“%5d” a【i】;}printf(“n”;}

PrintArray1(int a, int num){int i;for (i = 0; i < num; i++){printf(“%5d” ai;}printf(“n”;}

PrintArray2(int a【7】 int num)int i;for (i = 0; i < num; i++)printf(“%5d” a【i】;printf(“n”;int main(void)

int a = { 3,4,5,6,7,7,8 }。

int num = sizeofa / sizeofa【0】;PrintArraya, num

PrintArray1(a, num)

PrintArray2a, numsystem“pause”。

1.2 数组传参实质

数组实质传的都是指针,不论什么表现形式。

include “stdio.h”PrintArrayint *a, int numint i,num1;num1 = sizeofa / sizeofa【0】;printf“num = %5d”num1

for (i = 0; i < num; i++)printf(“%5d” a【i】;printf(“n”。

PrintArray1int a, int num{int i,num1;num1 = sizeofa / sizeofa0;printf“num = %5d” num1for i = 0; i < num; i++{printf“%5d” ai;}printf“n”;}

PrintArray2int a【7】 int numint i,num1;num1 = sizeofa / sizeofa【0】;printf“num = %5d” num1for i = 0; i < num; i++printf“%5d” a【i】;printf“n”;int mainvoid

int a = { 3,4,5,6,7,7,8 }。

int num = sizeofa / sizeofa【0】;PrintArraya, num

PrintArray1(a, num)

PrintArray2a, numsystem“pause”。

可以看到num1的值均为1。

实参都是数组,形参都是指针,无论什么形式。

include “stdio.h”int main(void)int a【10】

printf“a的大小 = %dn” sizeofa。

printf(“a = %dn” a)

printf(“a + 1 = %dn” a + 1)

printf(“&a = %dn” &a)

printf“&a + 1 = %dn” &a + 1system“pause”。

指针是C的灵魂,才算掌握了,C,内存中的栈是开口向下的(图2)

从这组输出我们可以看到几点:

a数组大小是40。因为一个int是4字节,一共10个。

数组a和&a值一样

&a+1是相当于偏移整个数组大小,也就是40字节。

变量在内存中的位置

变量在内存中有四个地方可以存放,读取修改变量实质都是通过指针修改。

3.1 变量存放的区域

指针是C的灵魂,才算掌握了,C,内存中的栈是开口向下的(图3)

3.2 常量例子

include “stdio.h”char *GetChar1(void){char *p1 = “abcdefg”return p1;}

char *GetChar2(void){char *p2 = “abcdefg1”return p2;}

int main(void)char *p1 = NULL;char *p2 = NULL。

指针是C的灵魂,才算掌握了,C,内存中的栈是开口向下的(图4)

在内存中表示为:

指针是C的灵魂,才算掌握了,C,内存中的栈是开口向下的(图5)

因为GetChar函数里面都是指针所以都放在栈区,而常量都在全局区。

接下来,还有一个易错的点!!

include “stdio.h”char *GetChar1(void){char *p1 = “abcdefg1”return p1;}

char *GetChar2(void){char *p2 = “abcdefg1”return p2;}

int main(void)char *p1 = NULL;char *p2 = NULL。

指针是C的灵魂,才算掌握了,C,内存中的栈是开口向下的(图6)

指针是C的灵魂,才算掌握了,C,内存中的栈是开口向下的(图7)

3.3 堆和栈例子

用户自己申明的变量是在堆中存放的,只有用户释放。

include “stdio.h”char *GetString(int num){char *s = NULL;s = (char *)malloc(sizeof(char)*num)if (s == NULL){return NULL;}return s;}int main(void){char *p1 = NULL;p1 = GetString(10)if (p1 == NULL){return;}strcpy(p1, “abcdefg”;printf(“%sn” p1)system(“pause”;}

内存中分布:

指针是C的灵魂,才算掌握了,C,内存中的栈是开口向下的(图8)

当GetString被调用后,s释放之后,malloc分配的空间还是存在,所以还能继续打印。

接下来的问题在实际写的过程中会犯错:

include “stdio.h”char *GetString(int num){char *s = NULL;s = (char *)malloc(sizeof(char)*num)if (s == NULL){return NULL;}return s;}

char *GetString1void{char s1【10】strcpys1, “qwerty”;printf“%sn” s1return s1;}int mainvoid{char *p1 = NULL;char *p2 = NULL;p1 = GetString10if p1 == NULL{return;}p2 = GetString1;strcpyp1, “abcdefg”;printf“%sn” p1printf“%sn” p2system“pause”;}

其他

内存中的栈是开口向下的。

本文相关词条概念解析:

指针

在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(pointsto)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。在高级语言中,指针有效地取代了在低级语言,如汇编语言与机器码,直接使用通用暂存器的地方,但它可能只适用于合法地址之中。指针参考了存储器中某个地址,通过被称为反参考指针的动作,可以取出在那个地址中存储的值。作个比喻,假设将电脑存储器当成一本书,一张内容记录了某个页码加上行号的便利贴,可以被当成是一个指向特定页面的指针;根据便利粘贴面的页码与行号,翻到那个页面,把那个页面的那一行文字读出来,就相当于是对这个指针进行反参考的动作。在信息工程中指针是一个用来指示一个内存地址的计算机语言的变量或中央处理器(CPU)中寄存器(Register)【用来指向该内存地址所对应的变量或数组】。指针一般出现在比较接近机器语言的语言,如汇编语言或C语言。面向对象的语言如Java一般避免用指针。指针一般指向一个函数或一个变量。在使用一个指针时,一个程序既可以直接使用这个指针所储存的内存地址,又可以使用这个地址里储存的函数的值。另外,指针也指钟表中用来指示对应时间的部件。

网友评论
相关阅读
天神下凡,C罗继续狂飙,同时也隔空完胜了梅西,C罗还缔造了两大无解神迹

天神下凡,C罗继续狂飙,同时也隔空完胜了梅西,C罗还缔造了两大无解神迹

北京时间7月12日凌晨,意甲联赛第32轮的比赛展开了一场重头

Mind的人工智能公司,帮助机器看懂这个世界

Mind的人工智能公司,帮助机器看懂这个世界

以下为文章核心要点:近几年人工智能风口再起,实际上是技术发展

迷彩热裤,彰显女人魅力

迷彩热裤,彰显女人魅力

这位美女上半身为黑色吊带针织面料,正面采用黑白条纹设计,U型

30岁韩国戏剧女王朴信惠,但比起恋爱的话题,但我们很幸福

30岁韩国戏剧女王朴信惠,但比起恋爱的话题,但我们很幸福

30岁韩国戏剧女王朴信惠,日前在《ALIVE》宣传采访中,大

为女儿亲自打造了一款超级智能轮椅,红外雷达判断路况,他拉上自己的工程师兄弟,后来成立了一家公司

为女儿亲自打造了一款超级智能轮椅,红外雷达判断路况,他拉上自己的工程师兄弟,后来成立了一家公司

大数据文摘出品提到智能轮椅,这可能并不是什么新鲜事,不少公司

娱乐城的页面,不止是运营商或者是路由器可能出问题

娱乐城的页面,不止是运营商或者是路由器可能出问题

各位差友平时上网冲浪的时候,有没有遇到过“ 绑架 ”?呃,差

战犬不是宠物,为和狗狗达成彼此信任

战犬不是宠物,为和狗狗达成彼此信任

剧情里,我倾向于根据真实题材改编的影片,不然的话,有关狗狗的

华为也扛不住了,跌至了新低价,麒麟980+50倍变焦

华为也扛不住了,跌至了新低价,麒麟980+50倍变焦

众所周知,华为已经成长为实至名归的手机大厂,国内和国际都拥有

但她曾经也是女团Rainbow的队长,上传她的身体状态

但她曾经也是女团Rainbow的队长,上传她的身体状态

提起金裁经,大家都知道她是N.Flying鼓手金宰铉的姐姐,

已经72岁的他,却在最近娶了比他小20多岁的娇妻,觉得他这是,老婆,了

已经72岁的他,却在最近娶了比他小20多岁的娇妻,觉得他这是,老婆,了

不得不说,娱乐圈确实挺混乱,其混乱不仅仅是体现在人物关系上,