问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c语言程序指针问题

发布网友 发布时间:2022-05-26 12:53

我来回答

1个回答

热心网友 时间:2023-10-18 01:06

一、指针变量的初始化问题

  指针变量同普通变量一样,使用之前不仅要定义说明,而且必须进行初始化,指针的 初始值必须是一个地址,决不允许赋予任何其他数据, 通常是一个数据的地址或地址 变量或空指针。
  1、指针变量未被初始化
  指针变量未被初始化,指针变量就不会被分配存储空间。在程序中如果使用了未被分配 空间的指针,就会出现难以查找的错误。
如在程序
main()
{int x, p;
x= 100;
*p= x;
printf(“*p=%d\n”,p);
}
中,指针变量p因没有初始化,在执行语句*p= x;之前p的内容是未知的,当程序将100赋给 一个没有确定指向内存的指针变量p,而使得数据100被存入一个未知的单元。这个程序虽然 很小,所占的内存小,问题不明显,但实质上它却隐含着一个致命的错误。这是因为随着程 序的增大,很有可能访问到致命的地址单元,将会导致计算机系统工作区域内有用数据的破 坏,引起数据段操作系统的损毁,造成机器运行失常,甚至 “死机”。
  解决方法是指针必须初始化后,才能使用。
  本例中 p=&x; 程序便可正常运行。

  2、指针初始值可赋值为空值 
  指针变量值为0的指针称为零指针(空指针)。其表示形式为int *p=0;表示p指向地 址为0的单元,系统保证该单元不作其他应用,表示指针变量值没有意义。可以写成:
#define NULL (void *)0
int *p=NULL;
定义零指针主要用于避免指针变量的非法引用和在程序中比较指针变量是否为空两个方 面。因此,不能把一个空指针用于除此之外的其他比较。若某些系统允许第0号内存既可以 被写入也可以被读出,这时错用空指针可能会改写操作系统的一部分内容,从而使系统彻底 崩溃;若系统只允许读0号内存,这时空指针指向一个有用的字符串;若系统对0号单元实行 写保护,则对空指针的操作将失败。.因此,使用空指针时要特别小心。

  二、指针变量赋值问题

  1、指针赋值带来的内存丢失
  在C语言中指针之间是可以相互赋值的,但是使用不当可能会造成部分内存的“丢失” ,即这部分内存空间不能再被该任何程序访问。如: 
main()
{float *a, *b;
a=(float)malloc( sizeof( float));
b=(float)malloc( sizeof( float));
*a= 227. 5;
*b= 163. 9;
a= b;
printf(“%f,%f,*a, *b);
}
  上例中将指针变量b赋给了指针变量a,使a与b都指向分配给b的内存空间,而原先分配 给a的内存空间未释放,不能再被其它任何程序访问,该内存空间成了“无效内存块”,内 存空间“丢失”了,而a后来指向的内存单元又直接或间接地被反复调用,内存愈来愈紧张 ,最终“死机”。
  解决方法:一个指针变量赋给另一个指针变量前,应先用free( )释放所占有的内存空 间,使这部分空间可以由系统重新支配,即应在赋值语句前执行:free (a)。
  2、指针变量赋值错误
  C语言规定,一个指针变量只能指向同类型的变量,不能时而指向一个整型变量,时而 指向一个字符型变量。当然,如果程序中确实需要进行不同类型的 指针变量进行赋值时, 则需要进行强制类型转换。
  3、混淆指针变量和它所指向的数据而导致程序错误
如在程序
main()
{int x, *p;
x= 10; p= x;
printf(“%d”,*p);
}
中,语句p= x把数据10而不是10所对应的单元地址赋给指针变量p,因而printf()调用 语句无法在屏幕上显示x的值。

  三、指针用于数组时应注意的问题

  1、混淆数组名与指针变量的区别
main()
{int i, a[ 8];
for( i= 0; i< 8; i++)
scanf(“%d”,a++);
}
  分析:C语言中约定,指针变量是一个变量,地址为其值;数组名是一个常量指针,在 系统为数组分配存储单元时确定,其值是该数组首元素的地址。因此.数组名不能自增自减 ,也不能在赋值语句中作左值.例程中企图通过对a的改变使指针下移,指向欲输入数据的数 组元素。它的错误在于不了解数组名代表的是数组首地址,是一个地址常量,而地址常量的 值是不能改变的。
  2、指针越界错误
  由于对内存中数据放置的错误假定,导致指针超出数据对象所占内存空间的大小。
例:main()
{int a[5], b[5] ;
int *p, i ; 
p=a; 
for (i=0; i<10:i++) *p++=i;}
  分析:该程序想通过指针变量p的自加运算来完成用0~9初始化数组a和b,但这是建立 在数组a和b相邻存放的基础上的,事实上这种情况并不一定成立。
  3、混淆数组与指针的区别
例:main()
{char *p=“beijing”;
p[0]= ‘B’;}
  分析:程序没有正确区分数组和指针。在C语言中,当把字符串常量赋予指针时,该字 符串常量就存储在静态存储区中。此时数据不能用指针修改,应用数组的方式进行修改。
追问你只用说 怎么修改就行了

c语言程序指针问题

C语言规定,一个指针变量只能指向同类型的变量,不能时而指向一个整型变量,时而 指向一个字符型变量。当然,如果程序中确实需要进行不同类型的 指针变量进行赋值时, 则需要进行强制类型转换。3、混淆指针变量和它所指向的数据而导致程序错误如在程序main(){int ...

C语言指针问题。

这是一个运算顺序的问题。注意括号的运用。(1) ++(*pointer)是先取值,再自增,当前pointer指向的是位置arr[3],取值后是2,*pointer的结果是2,2再自增,当然会得出3。值得说明的是,这个括号是可以省略的,此处括号只起到增加程序可读性的作用。(2)*(pointer-2)是先移动指针,再取值。p...

关于c语言指针的一些问题。

1、不是说系统64位它就是8字节,而是受限于地址总线的字节宽度,你的地址总线是64位的即指针就是8字节的,但是现在的64位个人pc多半是x86-64能兼容32位的应用程序。2、有,你64 位的机器,它的虚拟内存可以到8TB,如果你在64位机上装个32位的windows你会发现,我的个去……慢的要死(我犯过...

C语言的指针问题

程序从main函数开始执行。fun(&amp;y,&amp;x)和fun(int *x,int *y)对应。*x==y,*y==x;所以*x=2;*y==1;所以fun()输出21;在fun函数最后,*x=3,*y=4;因为y==*x,x==*y,所以y=3,x=4;因为&amp;y,&amp;x是引用,是对同一个地址内的变量进行操作,所以x,y的值会变化。

C语言指针问题

一、如有定义char y[4]= "321"则表达式 *y+2的值是'5' 。分析:y是字符串数组首元素'3'的地址,*y的值就是字符'3',再加上2,就是字符'5'(也可以说是字符'5'的ASC码值)。二、 如有定义char z[2][4]={"MAT", "LAB"};,则表达式*(*z+2)的值是 'T'。分析:z是二维字符...

问两道有关c语言字符指针的问题,请将程序每一步的意思告诉我,谢谢啦...

第一题答案:B。理由:*s与*t都是取出此时地址存储的值,while()语句里面的意思是,当指针s与t都不为空并且s指向的值等于t指向的值。。。当s或者t为空或者t与s指向的值不同时,while()结束,返回此时s指向的值减去t指向的值,所以为比较两个字符串的大小;第二题答案:A。理由:x的地址赋值...

c语言这几道题 关于指针的 望大神解答

2、A之所以错是因为代码中有一句q=NULL,也就是说q是一个空指针了,你再向里面写东西就错了,而且你在vc6.0中可以试一下,马上会出现一条0xc000 0005的写异常。。3、是的,你不管给它赋值多少都是4的。。就好比一个4平方米的房子,你装多少东西,装什么东西,它都是4平方米。有问题继续追问...

c语言指针问题

(2),对于*P1=*P2 操作之前,一定要先将P1和p2先指向变量。还有*p=3之前,也要先把p指向一个变量。指针就是一个指向地址的变量,使用之前需要先给它赋值,也就是先将将一个变量的地址赋值给它,这个时候指针里面存的就是这个变量的地址。理解了指针的概念,上面这些问题就好理解了~...

C语言中的指针问题到底是怎么回事~

在指针的算术运算中,指针所指向的类型有很大的作用。 指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越来越熟悉时,你会发现,把与指针搅和在一起的“类型”这个概念分成“指针的类型”和“指针所指向的类型”两个概念,是精通指针的关键点之一。我看了不少书,发现有些写得差的书中,就把...

c语言指针问题求详细过程

贴上代码,图片中讲解了程序运行过程,希望能帮助你加深对指针的理解。#include &lt;stdio.h&gt;f(int *a, int *b, int *c) {int *t;t=a;a=b;b=t;*t=*b;*b=*c;*c=*t;}main() {int a=5,b=7,c=3;int *p1=&amp;a,*p2=&amp;b,*p3=&amp;c;f(p1,p2,p3);printf("%d,%d,%d",a,b,...

有关指针的c语言程序 c语言指针程序 c语言指针简单程序 c语言指针程序100例 c语言程序设计指针 c语言指针编程题 c语言指针编程题及详解 c语言指针经典编程题 c语言程序问题
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
微软Win10 DirectX 12 Ultimate正式发布:如何统一AMD/NVIDIA PC显卡和X... 台湾咖啡店品牌有哪些 RedmiBook13首卖4199元,哪些配置的双十二尝鲜价分别是多少? 陂西镇自然环境 鹰凰斗破苍穹简介 骜鹰斗破苍穹简介 三原县陂西镇派出所所长电话 三原县陂西镇初级中学简介 同时用两种洗面奶好吗? 小屁孩日记:屁事多基本信息 计算机的安全性 德语ich mochte 我查字典 直陈过去时o上面没有两个小点啊 , 下列哪项不能增强信息安全? 德语中的sollte sollen sollen 是情态动词 应该 那sollte 又是什么 如何提高计算机安全性? 什么无助于加强计算机安全 德语情态动词的第二分词 德语:“sollte”是怎么用的? C语言程序设计 指针? 德语情态动词moegen什么意思 德语的被动态的第二虚拟式 请问德语Man sollte Nachbarn nicht zur Last fallen.中sollte是第二虚拟式吗? 请问紧迫感,jpeg格式照片是什么意思的照片 怎样照呢 事情十分紧急,时间十分紧迫是什么意思 如何理解教育中的闲暇与紧迫感的关系 德语第二虚拟式和条件式有什么区别?ihr h&#228;ttet gearbeitet.&#47;ihr würde 德语里情态动词的被动态,有第二虚拟式吗? 过桥米线里的过桥是什么意思,好吃吗 学习有紧迫感与没有紧迫感的区别 词语压迫感与紧迫感的区别 几月份考幼师资格证 如何提高电脑的安全性能? 共享资源会不会影响到计算机网络的性能及安全性 考幼师资格证有什么要求 在什么时候考呢 幼师资格证怎么考? 什么时候报名? 一共费用是多少? 多长时间下来? 什么软件可以提高计算机安全性能? 本科学前教育幼师资格证何时可以考 简述计算机上网从哪些方面考虑提高安全性 怎么让电脑性能不减,防止病毒,让电脑稳定运行? 涤纶会起球吗 做三维动画用3Dmax哪个版本的软件好? 动漫三维专业需要学习哪些软件? 制作3维动画用什么软件 连续四次考试都考差了,我该怎么办,请给我大佬教教我? 考试连续几次考砸,心态越来越差? 我是大一电气专业,需要寒假社会实践报告1500字。 含有反语写动物的作文300字 小动物作文至少有三个反语 描写小动物的作文,反语 用反语描写小动物的一段