精华内容
下载资源
问答
  • //length和i都为顺序表中的实际位置,但在C语言中数组第一个元素从0开始 所以要减去一。 l->elem[j - 1] = e; ++l->length;//先加一再使用i。 return ok; } status getelem(sqlist l, int i, elemtype *e) ...
  • C语言 常量与变量

    千次阅读 2013-03-18 19:54:45
    C语言 常量与变量 常量与变量 正所谓静中有动,动中有静,常量与...其实很多朋友在学到后面指针的时候经常会出现,段错误,晕指针(我对那些指针恐惧者的症状叫法),野指针等问题,都是因为对常量和变量的理解不

    C语言 常量与变量

    常量与变量

    正所谓静中有动,动中有静,常量与变量亦是如此,它们之前相互依赖,相互影响。关于常量与变量,很多朋友可能觉得没有什么好介绍的,它实在是太简单了,单从字面上看就知道什么意思?我想说的不是关于常量与变量的概念,而是其深入的实质。

    其实很多朋友在学到后面指针的时候经常会出现,段错误,晕指针(我对那些指针恐惧者的症状叫法),野指针等问题,都是因为对常量和变量的理解不够深入,基础理解不够踏实。

     

    常量:其值不会发生改变的量,称为常量。它们可以和数据类型接合起来分类。比如:整形常量,浮点型常量,字符常量等等,常量是可以不经过定义和初始化,而直接引用的。

    常量分类:常量又分为:直接常量和符号常量。

    直接常量又叫做:字面常量。如12,0,4.6,’a’,”abcd”

    符号常量:如宏定义的:#define PI 3.14

    特点:常量的值在其作用域内不会发生改变,也不能再被赋值。其在出现时就被当作一个立即数来使用。也就是说,只能被访问,被读,而不能被写,被赋值。

    其实,你一旦声明了一个常量,那么常量所在的内存空间就被加上了只读的属性,它有点类似于const关键字。

     

    变量:其值在其作用域内可以改变的量称为变量。一个变量应该有一个名字,在内存中占据一定的存储空间。变量在使用前必须要定义。每个变量都有自己的地址。

    变量分类:变量依据其定义的类型,分为不同类型,如:整型变量,字符型变量,浮点型变量,指针型变量等等。

    特点:变量其值可以发生改变,意味着它可以被覆盖,被写入,被赋值。每个变量必须要有一个名字和它所在内存空间绑定,如图xxx所示。

    图xxx 变量内存空间示意图

    代码中声明整型变量a,它的类型已经决定,那么它的大小也就是4个字节(32位机上),那么在内存中就有连续的四个字节与之对应,a变量名就代表了这四个字节的空间,a变量的地址就是连续四个字节的开始的地址0x000。就好像是饭店里每个房间都有一个地址,如201室代表二楼每一个房间,叫201不太雅观,我们起个名字叫:牡丹厅。那么,我们人为的将“牡丹厅”这个名字和201房间绑定在了一起。当我们说到牡丹厅,就知道是201房间,同样当我们说201房间我们也知道是牡丹厅。

    同样的道理,当我们说a变量,就知道是从0x000这个地址开始的4个字节,当我们说0x000地址就知道这是a变量的空间。那么既然a是变量也就是说它所代表的空间里的数据是可以修改的,同样0x000地址处的数据也是可以修改的。

    变量名和变量的值:

    变量名是在变量的声明的时候,该名字就和内存中一块地址绑定在一起了。可以通过变量名直接找到对应的内存区域,也可以通过地址找到其内存区域。

    变量的值是变量所对应的内存区域内存放的二进制序列。变量的值不会因为变量的类型发生了改变而改变,当变量被转换为对应类型时,内存区域的二进制序列以该类型的形式翻译出来。这也是强制类型转换能够成立的原因。

    例如:

    1. int a = 97;  
    2. char ch1 = ‘a’;  
    3. char ch2 = (char)a;  
    4. char *p = (char*)a;  


    第一行代码:整型变量a在内存中是以97的二进制形式存放的,当使用它时,会被以十进制形式表现出来。

    第二行代码:字符变量ch1的ASCII 码是97,也是以97的二进制存放的,使用时,会被以字符’a’的形式表现出来。

    第三行代码:将整型变量a强制类型转换成字符型,a变量里的值没有变,变的是它的类型,它里面的值还是97的二进制,它类型变成了char,97的二进制变成char型,表现出来就是字符’a’。

    第四行代码:声明一个字符型指针变量p,p是个变量,它里面的值可变,它的值是整型变量a的值强制类型转换成了字符指针类型。这个时候p里的值还是97的二进制,只不过这个97的意义已经代表了一个字符型指针,也就是一个指向字符的地址了。

    由此可见:变量在内存中存放和它的值没有关系,而是和它的类型相关的。同样我们也可以得出:一个二进制序列对于计算机本身而言没有任何意义,计算机根本不知道这个二进制数据是干什么的,只有具体到它的类型时或出现在合适的场合时,才能代表具体的意义。如果一串二进制数据出现在地址总线上,它代表是一个地址,如果该相同数据出现在数据总线上,它代表是一个数据。所以,当我们看到一个数据时,比如:3.1415926,不能把它戴上定向思维的帽子认为它就是PI,而是要看清它的本质,它就是一堆二进制代码。

    我们来看下下面的例子:

    1.

    char ch = ‘a’;

    int a = (int)ch;

    printf(“%d %c\n”, a, ch);

    ch是什么?ch里装的是什么?a是什么?a里面装的是什么?打印什么?

    2.

    int add = 0x12345678;

    int *p = (int*)add;

    add是什么?add里装的是什么?p是什么?p里装的是什么?*p又是什么?&p又是什么?

    3.

    #define PI 3.14

    int a = PI;

    printf(“%d\n”, a);

    上面的代码有没有问题?

    4.

    #define PI 3.14

    printf(“%d\n”, PI);

    代码有没有问题?

    5.

    #define PI 3.14

    int a = PI;

    PI = 3.1415926;

    int b = PI;

    printf(“%d %d\n”, a, b);

    代码有没有问题?

    6.

    char *str = “hello world”;

    printf(“%s\n”, str);

    str = “goodbye world”;

    printf(“%s\n”, str);

    代码有没有问题?

     

    答案:

    1.       测试对变量类型的理解和类型转换。ch是字符型变量,ch里是字符’a’的二进制数,a是整型变量,a里面是字符’a’的二进制数的整型表示方式,以十进制数表示出来97。打印结果为97 和 a。

    2.       测试对整型和地址类型转换。add是一个整数变量,add里是0x12345678的二进制数,以十进制表现出来,p是一个整型指针变量名,p里面是0x12345678的二进制数,以地址的方式表现出来,代表地址0x12345678。*p是通过*去访问地址0x12345678这个地址处的数据(如果你试图去打印它,会出错,因为这个地址你不一定有权限去访问)。&p是取出整型指针变量p的地址,因为p是一个变量,它也有自己的地址,所以可以取出它的地址来(见上面变量的定义)。

    3.       宏定义一个常量PI,PI这个符号代表了3.14,在代码执行前的预处理阶段第二行int a = PI,已经被替换为了int a = 3.14,将3.14赋值给整型,会舍弃掉小数点后面部分结果,仅保留整数部分,打印结果为3。

    4.       和上面3一样,在预处理阶段被替换成了printf(“%d\n”, 3.14),结果为1374389535,这是因为将浮点型的3.14在内存中的数据,以整型来表现的。

    5.       第三行PI = 3.1415926会出错,PI是个常量其被替换成了3.14 = 3.1415926,3.14是个字面常量,不能被赋值。错误信息为“向无效左值赋值出错”(关于常见错误信息,见C语言常见错误详解章节)。

    6.       第三行*str = “goodbye world”出错,第一行中将字符串常量“hello world”的首地址给了字符指针变量str,第三行试图将“goodbye world”的首地址,通过*str的访问方式覆盖str指向的字符串常量“hello world”。这句话理解起来都比较费劲,因为这里有两个错误:

    •  试图向常量里写数据。

                  “hello world” 是字符串常量,那么这个字符串空间里的内容不能改变。

    • 指针变量里应该放地址,字符串都是以首地址为地址。

                  向一个地址里写入字符串应该使用strcpy。*str只是代表了str指向的字符串中的第一个字符,将字符串地址写入到一个字符里肯定不行。

     

    关于上面说的,可能现在还不太好理解,请读者通读完C语言指针和数组之后再来细品,定会有不同程度的深入理解。

     

    ++++++++++++++++++++++++++++++++++++++++++

    《C语言深入理解系列 - 常量与变量》

    查看其它博文请关注原创作者。

    本文系本站原创,欢迎转载! 转载请注明出处:

    http://blog.csdn.net/mr_raptor/article/details/7212155

    ++++++++++++++++++++++++++++++++++++++++++


    展开全文
  • 你必须知道的495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    6.3 那么,在C语言中“指针和数组等价”到底是什么意思? 6.4 既然它们这么不同,那为什么作为函数形参的数组和指针声明可以互换呢? 数组不能被赋值 6.5 为什么不能这样向数组赋值?externchar*getpass();...
  • o 6.15 运行时的 ``空指针赋值" 错误什么意思? * 7. 数组和指针 o 7.1 我在一个源文件中定义了 char a[6], 在另一个中声明了 extern char *a 。为什么不行 ? o 7.2 可是我听说 char a[ ] 和 char *a 是...
  • c语言编写单片机技巧

    2009-04-19 12:15:17
    我是一名武汉大学电子科技大3的学生,学了电子线路、数字逻辑、汇编和接口、C语言,但是总是感觉很迷茫,觉好象什么都不会。怎么办? 答:大学过程是一个理论过程,实践的机会比较少,往往会造成理论与实践相...
  • 3.20 “semantics of‘’change in ANSI C”的警告是什么意思? 3.21 “无符号保护”和“值保护”规则的区别在哪里? 第4章 指针 基本的指针应用 4.1 指针到底有什么好处? 4.2 我想声明一个指针并为它分配一些空间...
  • 例如, pf1+pf2是什么意思呢?毫无实际意义。 ②两指针变量进行关系运算 指向同一数组的两指针变量进行关系运算可表示它们所指数组元素之间的关系。例如: pf1==pf2表示pf1和pf2指向同一数组元素 pf1>pf2表示pf1...
  • 《你必须知道的495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    3.20 “semantics of‘’change in ANSI C”的警告是什么意思? 42 3.21 “无符号保护”和“值保护”规则的区别在哪里? 42 第4章 指针 45 基本的指针应用 45 4.1 指针到底有什么好处? 45 4.2 我想声明...
  • 6.3 那么,在C语言中“指针和数组等价”到底是什么意思?  6.4 既然它们这么不同,那为什么作为函数形参的数组和指针声明可以互换呢?  数组不能被赋值  6.5 为什么不能这样向数组赋值?externchar*getpass();...
  • 5.20 运行时的“null pointer assignment”错误什么意思?应该怎样捕捉它? 62 第6章 数组和指针 63 数组和指针的基本关系 63 6.1 我在一个源文件中定义了char a[6],在另一个源文件中声明了extern char *a...
  • 题目 先来说一下题目所表示的意思吧。 这个题目非常坑爹,我读了一段时间才懂他在讲...5.字符串的长度不超过100指的是除了’\0’外最多可以有100个字符,所以字符串的长度要定义为101,若是小于101,则会出现“段错误

    题目
    先来说一下题目所表示的意思吧。
    这个题目非常坑爹,我读了一段时间才懂他在讲什么。A1=P之前的A的数量,A2是PT中间的A的数量,A3是T之后A的数量。A1,A2,A3必须满足A3=A1*A2的关系才可以。
    下面说一下这道题可能会出现的错误
    1.误解题目的意思
    2.忘记判断是否有PAT之外的字符
    3.忽略PT中间没有A的情况
    4.多个P或者多个T的错误情况忘记考虑
    5.字符串的长度不超过100指的是除了’\0’外最多可以有100个字符,所以字符串的长度要定义为101,若是小于101,则会出现“段错误”的情况
    6.scanf读取待判断字符串的数量之后忘记getchar()来读取走缓冲区中的回车键,这样会造成第一次使用gets读取字符串时直接独奏回车的情况
    下面附上代码

    我是通过P,T所在字符串的位置来确定A1,A2,A3的数量,再通过与字符串的长度进行比较来判断是否可以通过的。

    #include<stdio.h>
    #include<string.h>
    int PD(char* p);
    int main()
    {
    	char string[101];
    	int n, i;
    	scanf("%d", &n);
    	getchar();
    	for (i = 0; i < n; i++)
    	{
    		gets(string);
    		PD(string);
    	}
    }
    
    int PD(char* p)
    {
    	int P = 0, other = 0, T = 0, find_P, find_T, len, i = 0;
    	len = strlen(p);
    	do
    	{
    		if (p[i] == 'P')
    		{
    			P++;
    			find_P = i;
    		}
    		else if (p[i] == 'T')
    		{
    			T++;
    			find_T = i;
    		}
    		else if (p[i] != 'A')
    			other++;
    		i++;
    	} while (p[i] != '\0');
    	if (len != find_T + 1 + find_P * (find_T - find_P - 1) || P != 1 || other != 0 || T != 1 || find_T - find_P <= 1)
    	{
    		printf("NO\n");
    		return 0;
    	}
    	else
    		printf("YES\n");
    }
    

    欢迎大家讨论自己在做题的过程中遇到的问题 。

    展开全文
  •  6.3 那么,在C语言中“指针和数组等价”到底是什么意思? 6.4 既然它们这么不同,那为什么作为函数形参的数组和指针声明可以互换呢? 数组不能被赋值 6.5 为什么不能这样向数组赋值?externchar*getpass();...
  •  5.20 运行时的“null pointer assignment”错误什么意思?应该怎样捕捉它? 第6章 数组和指针  数组和指针的基本关系  6.1 我在一个源文件中定义了char a[6],在另一个源文件中声明了extern char *a。为什么...
  • 还有if(k==0)什么意思。。。。 int main() { int i,k=0; char username[15],usernode[6]; system("color 3f");//*************************改变编译器窗口颜色和字符颜色 /* 0 = 黑色 8 = 灰色 1 = 蓝色 9...
  • 3.20 “semantics of‘’change in ANSI C”的警告是什么意思? 3.21 “无符号保护”和“值保护”规则的区别在哪里? 第4章 指针 基本的指针应用 4.1 指针到底有什么好处? 4.2 我想声明一个指针并为它分配一些空间...
  • 你必须知道的495个C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    1.4 extern 在函数声明中是什么意思? . . . . . . . . . . . . . . . . . 2 1.5 关键字auto 到底有什么用途? . . . . . . . . . . . . . . . . . . . 2 1.6 我似乎不能成功定义一个链表。我试过typedef struct f ...
  • 3.20 “semantics of‘>’change in ANSI C”的警告是什么意思? 71 3.21 “无符号保护”和“值保护”规则的区别在哪里? 71 第4章 指针 74 基本的指针应用 74 4.1 指针到底有什么好处? 74 4.2 我想声明一个...
  • 3.20 “semantics of‘>’change in ANSI C”的警告是什么意思? 71 3.21 “无符号保护”和“值保护”规则的区别在哪里? 71 第4章 指针 74 基本的指针应用 74 4.1 指针到底有什么好处? 74 4.2 我想声明一个...
  • extern 在函数声明中是什么意思? . . . . . . . . . . . . . . . . . 2 1.5 关键字 auto 到底有什么用途? . . . . . . . . . . . . . . . . . . . 2 1.6 我似乎不能成功定义一个链表。我试过 typedef struct { ...
  • Java编程思想(完整版)

    2012-02-13 00:13:57
    之所以说C++是一种杂合语言,是因为它支持与C语言的向后兼容能力。由于C++是C的一个超集,所以包含的许多特性都是后者不具备的,这些特性使C++在某些地方显得过于复杂。 Java语言首先便假定了我们只希望进行面向对象...
  • 它是什么意思? 答:和while(1)相同。 5、do……while和while……do有什么区别? 答:前一个循环一遍再判断,后一个判断以后再循环 6、请写出下列代码的输出内容 #include main() { int a,b,c,d; a=10; b=a++; c=++a...
  • JAVA面试题最全集

    2010-03-13 13:09:10
    87.UNIX中QT是什么意思? 88.在软件开发生命周期中的哪个阶段开始测试? 89.dotnet与J2EE的比较? 90.什么是ActiveX? 91.Java中IDL是什么? 92.ISO9000和CMM是什么?IS09000和CMM(软件能力成熟度模型)认证是国际上...
  • 答:意思是如何防止同时产生大量的线程,方法是使用线程池,线程池具有可以同时提 高调度效率和限制资源使用的好处,线程池中的线程达到最大数时,其他线程就会排队 等候。 15函数模板与类模板有什么区别? 答:...
  • TQ2440下keil测试程序

    2012-08-30 07:54:36
    更正:经29楼网友指出,原文的这一错误的,ARM9是哈佛结构的,已经删了 “2440算是冯诺什么曼结构的计算机, 通俗的说, 2440的程序代码是可以放在RAM里面执行(我们的PC机也是这种类型的), 不同于51, 也许你会注意...
  • 经过跟踪调试发现问题出现在如下一代码中: 1 for(i=0; i<pSysHead->dbf_count; i++) 2 { 3 pDBFat = (_NM_DBFAT_STRUC *)(NVDB_BASE + DBFAT_OFFSET + i*DBFAT_LEN); 4 if(fat_check(pDBFat) != 0) 5 { 6 ...

空空如也

空空如也

1 2
收藏数 38
精华内容 15
关键字:

c语言段错误什么意思

c语言 订阅