1C语言空指针NULL
空指针的简单描述:
它 “与任何对象或函数的指针值都不相等”。也就是说, 取地址操作符 & 永远也不能得到空指针, 同样对 malloc() 的成功调用也不会返回空指针, 如果失败, malloc() 的确返回空指针, 这是空指针的典型用法:表示 “未分配”或者 “尚未指向任何地方”的指针。
========================================================================================
空指针和未初始化的指针:
空指针在概念上不同于未初始化的指针。空指针可以确保不指向任何对象或函数; 而未初始化指针则可能指向任何地方。
========================================================================================
空指针和 0
根据语言定义, 在指针上下文中的常数 0 会在编译时转换为空指针。
具体如下:
------------------------------------------------------------------------------------
可以使用未加修饰的0 需要显示的类型转换
------------------------------------------------------------------------------------
初始化 函数调用, 作用域内无原型
赋值 变参函数调用中的可变参数
比较
固定参数的函数调用且在作用域
内有原型
char *p = 0; execl("/bin/sh", "sh", "-c", "date", (char *)0);
if(p != 0)
-------------------------------------------------------------------------------------
注意:
if(p) 等价于 if(p != 0)。
这是一个比较上下文, 因此编译器可以看出 0 实际上是一个空指针常数, 并使用正确的空指针值。这里没有任何欺骗; 编译器就是这样工作的, 并为、二者生成完全一样的代码。
--*空指针的内部表达无关紧要。*--
=========================================================================================
NULL和空指针
作为一种风格, 很多人不愿意在程序中到处出现未加修饰的 0。因此定义了预处理宏 NULL (在 <stdio.h> 和其它几个头文件中) 为空指针常数, 通常是 0 或者((void *)0) 。希望区别整数 0 和空指针 0 的人可以在需要空指针的地方使用NULL。
--*使用NULL只是一种风格习惯;*--
预处理器把所有的NULL都还原回0, 而编译还是依照上文的描述处理指针上下文的 0。特别是, 在函数调用的参数里, NULL之前 (正如在 0 之前) 的类型转换还是需要。C 程序员应该明白, 在指针上下文中 NULL 和 0 是完全等价的, 而未加修饰的 0 也完全可以接受。
--*任何使用 NULL (跟 0 相对) 的地方都应该看作一种温和的提示, 是在使用指针。*--
程序员 (和编译器都) 不能依靠它来区别指针0和整数 0。特别是, 不能在需要 ASCII 空字符 (NUL) 的地方用NULL。如果有必要, 提供你自己的定义#define NUL ’\0’。
=======================================================================================
空指针的迷雾:
空指针的内部 (或运行期) 表达形式, 这可能并不是全零, 而且对不用的指针类型可能不一样。真正的值只有编译器开发者才关心。C程序的作者永远看不到它们。
理清楚几个概念
1,空指针,参见开头的定义,不同机器对于空指针的定义可能不同。
2,空指针常数,0 ,这个常数由编译器在运行阶段根据处理指针的上下文来转换为实际机器的空指针表达;
3,NULL宏,它只是空指针常熟的一种风格的定义,有好的提示使用的是指针。
4,ASCII空字符(NUL), 它的确是全零, 但它和空指针除了在名称上以外, 没有任何必然关系。
5,“空串” (null string), 它是内容为空的字符串 ("")。在 C 中使用空串这个术语可能令人困惑, 因为空串包括空字符 (’\0’),但不包括空指针。
冲出迷雾:
冲出这些迷惘的一个好办法是想象 C 使用一个关键字作为空指针常数。编译器要么在源代码没有歧义的时候把空指针常数转成适当类型的空指针, 或者有歧义的时候发出提示。C 语言的空指针常数
关键字是“0”, 这在多数情况下都能正常工作, 除了一个未加修饰的“0” 用在非指针上下文的时候, 编译器把它生成整数 0 而不是发出错误信息, 如果那个未加修饰的0是应该是空指针常数, 那么生成的程序不行。
简单的方法:
1. 当你在源码中需要空指针常数时, 用“0” 或“NULL”。
2. 如果在函数调用中 “0” 或 “NULL” 用作参数, 把它转换成被调函数需要的指
针类型(实际上这个2条件有点过于苛刻)
2.break能跳出几层循环?
貌似只有一层:
#include <stdio.h>
void main(){
int a=1;
int i,j;
for(i=1;i<10;i++){
for(j=1;j<10;j++){
printf("j=%d",j);
if(j==5)
break;
}
printf("i=%d",i);
}
}
3.学习思想:
c和指针p115,第二题。
如何查找匹配字符串
#include <STDIO.H>
#define NULL 0
#define NUL '\0'
#define TRUE 1
#define FALSE 0
char *match(char *str,char *want)
{
while(*want!=NUL)
if(*str++!=*want++)
return NULL;
return str;
}
int del_substr(char *str, char const *substr)
{
char *next;
while(*str!=NUL)
{
next=match(str,substr);
if(next!=NULL)
break;
str++;
}
if(*str==NUL)
return FALSE;
while(*str++=*next++)
;
return TRUE;
}
void main()
{
char s1[]="abcdefg",s2[]="cde";
printf("%d",del_substr(s1,s2));
}
分享到:
相关推荐
### C语言指针学习笔记知识点解析 #### 一、C语言中的数据类型 在学习C语言的过程中,了解数据类型是非常重要的第一步。数据类型不仅决定了变量所占用的内存大小,还决定了变量的操作方式。 ##### 1. 基本数据...
### 超强的C语言指针学习笔记 #### 知识点概览 本文将深入探讨C语言中的指针概念及其复杂声明的理解方法——右左法则。文章将分为以下几个部分进行详细介绍: 1. **指针基础知识回顾** 2. **右左法则详解** 3. **...
标题:“C和C++指针(Pointer on C)” 描述:这份资料被赞誉为学习C语言的必备资源,尤其在理解和运用指针方面提供了深入的见解。指针是C语言中一个复杂但至关重要的概念,它允许程序员直接操作内存地址,从而实现...
本笔记主要介绍了C语言中的指针和数组相关知识点,旨在帮助读者更好地理解和应用C语言中的指针和数组。 一、变量和内存 在C语言中,变量是存储数据的基本单元。变量可以是整数、浮点数、字符等类型。在内存中,...
《Pointer on C》这本书是C语言学习者的重要参考资料,尤其对于初学者来说,它提供了深入理解和掌握C语言指针的宝贵知识。C语言是计算机科学的基础,而指针是其核心概念之一,它允许程序员直接操作内存,实现高效的...
pointer on C 中文版
从给定的文件信息来看,这是一份关于C语言与指针学习的教材或课程的指导手册,旨在为学生提供深入理解C语言中指针概念的机会,并通过一系列章节讲解及练习题来强化学习效果。以下是对该文件所涵盖的关键知识点的详细...
通过本文的学习,相信你已经对C语言中的指针有了更深入的理解。指针虽然看似复杂,但一旦掌握了其核心概念和使用技巧,就能极大地提高程序的灵活性和性能。希望本文能帮助你在实际编程中更好地利用指针。
d\n", fun1(1, 2), (*...总的来说,理解C语言中的函数指针是掌握C语言高级特性和编写高效代码的关键。通过熟练运用函数指针,可以实现回调、策略模式、工厂方法等高级编程概念,极大地提高了代码的灵活性和可扩展性。
在C语言中,字符串和指针密切相关,字符串常量在内存中是静态分配的,而字符数组可以动态地初始化和修改。字符串指针可以用来遍历字符串,也可以作为函数参数传递,这使得字符串处理更加灵活。 7. **指针和数组的...
其中,“指针”是C语言的一个核心概念,掌握好指针对于深入理解和高效利用C语言至关重要。本文将通过解析给定的“C语言指针课件”,详细介绍C语言中指针的基本概念及其应用。 #### 二、地址和指针的概念 在计算机...
- 通过《C语言指针大全.doc》和《MethodPointer.png》中的实例,可以进一步理解和应用上述概念,解决实际编程问题。 在学习和使用C语言指针时,务必重视实践,通过编写代码加深理解。同时,理解指针的底层工作原理...
【C语言指针课程PPT】讲解了C语言中核心的指针概念,它是C语言高效编程的关键。指针允许程序直接访问内存地址,增强了代码的灵活性和性能。以下是关于指针的详细知识点: 1. **变量与内存地址**: - 当在C语言中...
指针是C语言最独特和令人兴奋的特性之一,它增加了这门语言的能力和灵活性。指针对于初学者来说可能显得有点令人糊涂和不易理解,但一旦被掌握,它们将成为强有力的工具并变得易于使用。 概念 * 指针(Pointers)...
"pointer on c"是指关于C语言中指针的专题学习,指针在C语言中扮演着至关重要的角色。指针变量存储的是其他变量的内存地址,这使得我们可以直接操作被引用的变量,进行数据传递、动态内存分配、函数调用等多种复杂...
C语言中的指针是编程中的一个关键概念,它在程序设计中起着至关重要的作用。指针是C语言中一种特殊的变量,它存储的是内存地址,即其他变量在内存中的位置。...学习并熟练掌握指针是成为C语言专家的关键步骤。
- 指针运算:学习指针的算术运算,包括加减操作以及它们在数组和字符串中的应用。 - 函数指针:理解函数指针的概念,如何声明和使用函数指针,以及它们在回调函数和模式匹配中的角色。 - 指针与数组的关系:探究...
4. **表示复杂数据结构**:指针可以构成复杂的结构,如树、图等,这是C++中的对象和类的基础。 在C语言中,定义指针变量通常采用`基类型 *指针变量名`的形式,例如`int *pa`定义了一个指向整型变量的指针`pa`。为了...
### C语言指针用法难点解析 ...掌握好指针的使用不仅能够提高代码的执行效率,还能更好地理解和应用C语言的强大功能。当然,学习过程中还需要不断实践与总结经验,才能更加熟练地运用指针解决实际问题。