c语言考试中的问题 c语言定义指针变量量的值是什么

关于C语言指针赋值的问题详解
字体:[ ] 类型:转载 时间:
本篇文章是对C语言指针赋值的问题进行了详细的分析介绍,需要的朋友参考下
一个代码: 代码如下:#include&stdio.h&#include&stdlib.h&#define uchar unsigned char#define uint unsigned int
void display(uchar *p);
char h[4] = {'A','B','C','\0'};char e[4] = {'E','F','L','\0'};char l[4] = {'M','N','O','\0'};char o[4] = {'X','Y','Z','\0'};
int main(void){&&&&&&&&& uint set[5];
&&& set[0] =&&& set[1] =&&& set[2] =&&& set[3] =&&& set[4] =
&&&&&& while(1){&&&&&&&&&& for (i = 0; i & 5; ++i){&&&&&&&&&&&&&&& display(set[i]);&&&&&&&&&&&&&&& printf("\n");&&&&&&&&&&&&&&& sleep(1);
&&&&&&&&& }
void display(uchar *p){&& while(*p != '\0'){&&& printf("%c", *p);&&& printf("%c", *(p+1));&&& ++p;&&& }}警报如下:
test.c:21: 警告: 赋值时将指针赋给整数,未作类型转换test.c:22: 警告: 赋值时将指针赋给整数,未作类型转换test.c:23: 警告: 赋值时将指针赋给整数,未作类型转换test.c:24: 警告: 赋值时将指针赋给整数,未作类型转换test.c:25: 警告: 赋值时将指针赋给整数,未作类型转换test.c:29: 警告: 传递参数 1 (属于 ‘display')时将整数赋给指针,未作类型转换
其中21-25就是set[0] =set[1] =set[2] =set[3] =set[4] =29是display(set[i])
虽然只是警报,并且在linux下面也可以运行的很好.但是既然警告了.还是值得讨论下.
待续~关注中...
如果有哪位知道.可否回复告诉我.谢谢~
------------------------------------------------------------
关于这个问题,我问了寝室的小丁.经过他的修改.程序已经不报警告了. 代码如下:#include&stdio.h&#include&stdlib.h&#define uchar unsigned char#define uint unsigned int
void display(uchar *p);
char h[4] = {'A','B','C','\0'};char e[4] = {'E','F','L','\0'};char l[4] = {'M','N','O','\0'};char o[4] = {'X','Y','Z','\0'};
int main(void){&&&&&&&&& int set[5];
&&& set[0] =(int)&&& set[1] =(int)&&& set[2] =(int)&&& set[3] =(int)&&& set[4] =(int)
&&&&&& while(1){&&&&&&&&&& for (i = 0; i & 5; ++i){&&&&&&&&&&&&&&& display((uchar *)set[i]);&&&&&&&&&&&&&&& printf("\n");&&&&&&&&&&&&&&& sleep(1);
&&&&&&&&& }
void display(uchar *p){&& while(*p != '\0'){&&& printf("%c", *p);&&& printf("%c", *(p+1));&&& ++p;&&& }}在字模数组的首地址赋值方面用了强制转换为int.在函数调用方面.因为子函数中要求到输入为指针,所以在前面的调用时候,不能单纯的写set[i].而是传指针过去.(uchar *)的强制类型转换是为了配合(uchar *p).-------------------------------------------应该注意的2点是:1.给指针只能传地址,不能传值.否则要做强制类型转换.2.在做类型转换和赋值时候,应该注意赋值的类型匹配.
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具在C语言中什么是指针?指针是干什么用的?,有什么意义?
简单地说指针就是指向变量和对象的地址。
指针的用途非常广泛,比如如果你想通过函数改变一个变量的值,就得用指针而不能用值传递。还有在很多时候变量,特别是对象的数据量实在太大,程序员就会用指针来做形参,只需要传递一个地址就行,大大提高了效率。
以上还只是指针的初步应用,随着你在C++学习上的逐步深入,你会发现更多的用途的。
其他答案(共4个回答)
++语言中最强劲也是最容易出错的要素。
  鉴于指针和目前计算机内存结构的关联,很多C语言比较本质的特点都孕育在其中,因此,本篇和第六、第七两篇我都将以指针为主线,结合在实际编程中遇到的问题,来详细谈谈关于指针的几个重要方面。
  指针类型的本质分析
Joel Spolsky认为,对指针的理解是一种aptitude,不是通过训练就可以达到的。虽然如此,我还是想谈一谈这个相关信息++语言中最强劲也是最容易出错的要素。
  鉴于指针和目前计算机内存结构的关联,很多C语言比较本质的特点都孕育在其中,因此,本篇和第六、第七两篇我都将以指针为主线,结合在实际编程中遇到的问题,来详细谈谈关于指针的几个重要方面。
  指针类型的本质分析
  1、指针的本质
  指针的本质:一种复合的数据类型。下面我将以下面几个作为例子进行展开分析:
  a)、int *p;
  b)、int **p;
  c)、int (*parValue)[3];
  d)、int (*pFun)();
  分析:
  所谓的数据类型就是具有某种数据特征的东东,比如数据类型char,它的数据特征就是它所占据的内存为1个字节, 指针也很类似,指针所指向的值也占据着内存中的一块地址,地址的长度与指针的类型有关,比如对于char型指针,这个指针占据的内存就是1个字节,因此指针也是一种数据类型,但我们知道指针本身也占据了一个内存空间地址,地址的长度和机器的字长有关,比如在32位机器中,这个长度就是4个字节,因此指针本身也同样是一种数据类型,因此,我们说,指针其实是一种复合的数据类型,
  好了,现在我们可以分析上面的几个例子了。
  假设有如下定义:
  那么,nValue的类型就是int,也就是把nValue这个具体变量去掉后剩余的部分,因此,上面的4个声明可以类比进行分析:
  a)、int *
  *代表变量(指针本身)的值是一个地址,int代表这个地址里面存放的是一个整数,这两个结合起来,int *定义了一个指向整数的指针,类推如下:
  b)、int **
  指向一个指向整数的指针的指针。
  c)、int (*)[3]
  指向一个拥有三个整数的数组的指针。
  d)、int (*)()
  指向一个函数的指针,这个函数参数为空,返回值为整数。
  分析结束,从上面可以看出,指针包括两个方面,一个是它本身的值,是一个内存中的地址;另一个是指针所指向的物,是这个地址中所存放着具有各种各样意义的数据。
  2、对指针本身值的分析
  下面例子考察指针本身的值(环境为32位的计算机):
void *p = malloc( 100 );
  请计算sizeof ( p ) = ?
char str[] = “Hello” ;
char *p =
  请计算sizeof ( p ) = ?
void Func ( char str[100])
{
请计算 sizeof( str ) = ? //注意,此时,str已经退化为一个指针,详情见
//下一篇指针与数组
}
  分析:上面的例子,答案都是4,因为从上面的讨论可以知道,指针本身的值对应着内存中的一个地址,它的size只与机器的字长有关(即它是由系统的内存模型决定的),在32位机器中,这个长度是4个字节。
  3、对指针所指向物的分析
  现在再对指针这个复合类型的第二部分,指针所指向物的意义进行分析。
  上面我们已经得到了指针本身的类型,那么将指针本身的类型去掉 “*”号就可得到指针所指向物的类型,分别如下:
  a)、int
  所指向物是一个整数。
  b)、int*
  所指向物是一个指向整数的指针。
  c)、int ()[3]
  ()为空,可以去掉,变为int [3],所指向物是一个拥有三个整数的数组。
  d)、int ()()
  第一个()为空,可以去掉,变为int (),所指向物是一个函数,这个函数的参数为空,返回值为整数。
  4、附加分析
  另外,关于指针本身大小的问题,在C++中与C有所不同,这里我也顺带谈一下。
  在C++中,对于指向对象成员的指针,它的大小不一定是4个字节,这主要是因为在引入多重虚拟继承以及虚拟函数的时候,有些附加的信息也需要通过这个指针进行传递,因此指向对象成员的指针会增大,不论是指向成员数据,还是成员函数都是如此,具体与编译器的实现有关,你可以编写个很小的C++程序去验证一下。另外,对一个类的静态成员(static member,可以是静态成员变量或者静态成员函数)来说,指向它的指针只是普通的函数指针,而不是一个指向类成员的指针,所以它的大小不会增加,仍旧是4个字节。
  指针运算符&和*
  “&和*”,它们是一对相反的操作,’&’取得一个物的地址(也就是指针本身),’*’得到一个地址里放的物(指针所指向的物)。这个东西可以是值(对象)、函数、数组、类成员(class member)等等。
  参照上面的分析我们可以很好地理解&与*。
  使用指针的好处?
  关于指针的本质和基本的运算符我们讨论过了,在这里,我想再笼总地谈一谈使用指针的必要性和好处,为我们今后的使用和对后面篇章的理解做好铺垫。简而言之,指针有以下好处:
  1)、方便使用动态分配的数组。
  这个解释我放在本系列第六篇中进行讲解。
  2)、对于相同类型(甚至是相似类型)的多个变量进行通用访问。
  就是用一个指针变量不断在多个变量之间指来指去,从而使得非常应用起来非常灵活,不过,这招也比较危险,需要小心使用:因为出现错误的指针是编程中非常忌讳的事情。
  3)、变相改变一个函数的值传递特性。
  说白了,就是指针的传地址作用,将一个变量的地址作为参数传给函数,这样函数就可以修改那个变量了。
  4)、节省函数调用代价。
  我们可以将参数,尤其是大个的参数(例如结构,对象等),将他们地址作为参数传给函数,这样可以省去编译器为它们制作副本所带来的空间和时间上的开销。
  5)、动态扩展数据结构。
  因为指针可以动态地使用malloc/new生成堆上的内存,所以在需要动态扩展数据结构的时候,非常有用;比如对于树、链表、Hash表等,这几乎是必不可少的特性。
  6)、与目前计算机的内存模型相对应,可按照内存地址进行直接存取,这使得C非常适合于一些较底层的应用。
  这也是C/C++指针一个强大的优点,我会在后面讲述C语言的底层操作时,较详细地介绍这个优点的应用。
  7)、遍历数组。
  据个例子来说吧,当你需要对字符串数组进行操作时,想一想,你当然要用字符串指针在字符串上扫来扫去。
  …实在太多了,你可以慢慢来补充^_^。
  指针本身的相关问题
  1、问题:空指针的定义
  曾经看过有的.h文件将NULL定义为0L,为什么?
  答案与分析:
  这是一个关于空指针宏定义的问题。指针在C语言中是经常使用的,有时需要将一个指针置为空指针,例如在指针变量初始化的时候。
C语言中的空指针和Pascal或者Lisp语言中的NIL具有相同的地位。那如何定义空指针呢?下面的语句是正确的:
char *p1 = 0;
int *p2;
if (p != 0)
{
...
}
p2 = 0;
  也就是说,在指针变量的初始化、赋值、比较操作中,0会被编译器理解为要将指针置为空指针。至于空指针的内部表示是否是0,则随不同的机器类型而定,不过通常都是0。但是在另外一些场合下,例如函数的参数原型是指针类型,函数调用时如果将0作为参数传入,编译器则不能将其理解为空指针。此时需要明确的类型转换,例如:
void func (char *p);
func ((char *)0);
  一般情况下,0是可以放在代码中和指针关联使用的,但是有些程序员(数量还不少呦!也许就包括你在内)不喜欢0的直白,认为其不能表示作为指针的特殊含义,于是要定义一个宏NULL,来明确表示空指针常量。这也是对的,人家C语言标准就明确说:“ NULL应该被定义为与实现相关的空指针常量”。但是将NULL定义成什么样的值呢?我想你一定见过好几种定义NULL的方法:
#define NULL 0
#define NULL (char *)0
#define NULL (void *)0
  在我们使用的绝大多数计算系统上,例如PC,上述定义是能够工作的。然而,世界上还有很多其它种类的计算机,其CPU也不是Intel的。在某些系统上,指针和整数的大小和内部表示并不一致,甚至不同类型的指针的大小都不一致。为了避免这种可移植性问题,0L是一种最为安全的、最妥帖的定义方式。0L的含义是: “值为0的整数常量表达式”。这与C语言给出的空指针定义完全一致。因此,建议采用0L作为空指针常量NULL的值。
  其实 NULL定义值,和操作系统的的平台有关, 将一个指针定义为 NULL, 其用意是为了保护操作系统,因为通过指针可以访问任何一块地址, 但是,有些数据是不许一般用户访问的,比如操作系统的核心数据。 当我们通过一个空(NULL)的指针去方位数据时,系统会提示非法, 那么系统又是如何知道的呢??
  以windows2000系统为例, 该系统规定系统中每个进程的起始地址(0x)开始的某个地址范围内是存放系统数据的,用户进程无法访问, 所以当用户用空指针(0)访问时,其实访问的就是0x地址的系统数据,由于该地址数据是受系统保护的,所以系统会提示错误(指针访问非法)。
  这也就是说NULL值不一定要定义成0,起始只要定义在系统的保护范围的地址空间内,比如定义成(0xx)都会起到相同的作用,但是为了考虑到移植性,普遍定义为0 。
  2、问题:与指针相关的编程规则&规则分析
  指针既然这么重要,而且容易出错,那么有没有方法可以很好地减少这些指针相关问题的出现呢?
  答案与分析:
  减少出错的根本是彻底理解指针。
  在方法上,遵循一定的编码规则可能是最立竿见影的方法了,下面我来阐述一下与指针相关的编程规则:
  1) 未使用的指针初始化为NULL 。
  2) 在给指针分配空间前、分配后均应作判断。
  3) 指针所指向的内容删除后也要清除指针本身。
  要牢记指针是一个复合的数据结构这个本质,所以我们不论初始化和清除都要同时兼顾指针本身(上述规则1,3)和指针所指向的内容(上述规则2,3)这两个方面。
  遵循这些规则可以有效地减少指针出错,我们来看下面的例子:
void Test(void)
{
 char *str = (char *) malloc(100);
 strcpy(str, “hello”);
 free(str);
 if(str != NULL)
 {
  strcpy(str, “world”);
  printf(str);
 }
}
  请问运行Test函数会有什么样的结果?
  篡改动态内存区的内容,后果难以预料,非常危险。因为free(str);之后,str成为野指针,if(str != NULL)语句不起作用。
  如果我们牢记规则3,在free(str)后增加语句:
str = NULL;
  那么,就可以防止这样的错误发生。
<a href="/b/9960741.html" title="入门级的C语言问题!#include入门级的C语言问题!#include<s...
为了访问内存,需要对内存里的单元进行编号如0,1,2,3...(这的确很像房子跟房子的编号,如我住南新大街7栋(起始地址),401房(偏移地址),所以找我请到南新大街7栋401房,当然前面应该还有起始地址,如某某区的南新大街), 为了存放这些编号(地址),就用了一个变量,即指针变量(它的值可能是0或1或2...它指向的就是一个具体的存储单元).
写简单的程序的话不用指针也行了吧. 比如, int a = 2; int* p = &a; *p = 3; 这里a是一个地址(编译后), 为了读写这个地址单元里的东西,可以用p,也可以用一般变量a.
对于指针的便利,我现在能想到的,可能是:
函数A调用函数B时,把一个内存块的地址传递过去,这样可以避免按值传递时开辟一个栈空间并逐一拷贝内存块里的值的开销(C++里的拷贝构造函数在做这件事),并且A,B函数操作的都是同一个内存块里的东西,如果这就是目的,那么传指针就是很有效率的做法(如果不用指针就可能要用一个全局的变量了).
用一个指针(函数指针)存放一系列同类型的函数名(入口地址),方便函数调用.
void*类型指针可以存放任何类型指针.
让父类类型指针指向任何子类对象可以实现动态绑定.
写着写着似乎指针还挺有用,呵呵.
我相信指针的使用一定要很小心,否则可能要忍受程序报错而总找不到错在何处的痛苦. 有一些比较极端的例子, 如一个函数返回了一个函数里局部变量的指针,一用就出错; 如声明一个指针没有分配空间就传给别一函数使用; 如多个线程都在使用同一个内存块,你修我改,甚至有人把它删掉了或不小心让指针指向系统用的内存,另一个人还准备往里读写东西---可能要费心思来同步. 如指针指向的内存可能是new/malloc出来的,可能要想办法及时删除并要保证没有别的线程要用...
指针是c的精髓//----转载--指针详解原著:什么是指针?和其它变量一样,指针是基本的变量,所不同的是指针包含一个实际的数据,该数据代表一个可以找到实际信息的...
一个整数在32位系统中是占用4字节的,而返回的只是这4个字节的起始地址,它的全地址就是以这个地址开始的后面的4个字节.而数组是相同类型的一组变量组成的,它们每个...
优秀的程序员不是一天写多少代码的原因把,主要是他设计的算法的好坏把,如果一个人一天写了几M的代码,里面有80%是无用代码,他优秀吗?
char是容纳单字符的一种基本数据类型不能存储汉字,(一个汉字占2字节)存储字符串用string,其实String就是一个char的数组,不过它当中的元素多一个...
答: swisspass familay card瑞士通票的家庭卡不需要输入任何信息吗?
答: 如果你理解能力强考数据库,其中比如关系数据库之类的需要去领悟如果你记忆能力强考网络,各种各样的名词,背下来就得分。还有官方指定的教材要有,上机最好做一做南开百题...
答: 新年好!首先,你必须了解计算机的组成和结构以及操作系统的运作原理,这是基础如果你想学习开发多线程、WINDOWS应用、动态链接库、WINDOWS组件的话,建议你...
大家还关注
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区
相关问答:123456789101112131415详解C语言指针变量交换问题_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
详解C语言指针变量交换问题
&&详解C语言指针变量交换问题
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢c语言中的指针变量问题,小白求指教
*px=&a 这个*px取的是a的内容
px=&a 这个是取的地址
为什么第一种那样就是内容第二种就是地址?
px 是个指针,所以它是一个存有地址的变量,px = &a 就是px存 &a(就是a的地址)*px 访问的是px这个变量值(地址)对应的空间, 故*px = &a 等价于 px存的地址对应的空间赋值为 (&a)
你还没有登录,请先登录或注册慕课网帐号
*px=&a指的是一个px指针指向变量a,在计算机内存中所指向的是地址,所以这就意味着px等于变量a的地址值,*px就是等于变量a的内容值。
你还没有登录,请先登录或注册慕课网帐号
指针本身就是一个变量,只不过是用来存储地址的变量。px就是存了a的地址的一个指针变量,*px就是得到px存储的地址对应变量的值,如果还是不能理解,你可以去查查指针的原理
你还没有登录,请先登录或注册慕课网帐号
第一种是初始化。
你还没有登录,请先登录或注册慕课网帐号
22624人关注
6919人关注
13550人关注
Copyright (C)
All Rights Reserved | 京ICP备 号-2}

我要回帖

更多关于 c语言函数指针变量 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信