reference:https://www.cnblogs.com/losesea/archive/2012/11/16/2772590.html 首先说一下什么是指针,只要明白了指针的含义,你就明白null的含义了.假设 有语句 int a=10;那么编译器就在内存中开辟1个整型单元存放变量a,我们假设这个整型单元在内存中的地址是 0x1000:那么内存0x1000单元中存放了数据10,每次我们访问a的时候,实际上都是访问的0x1000单元中的10. int *p : p=&a : 当编译器遇…
http://www.cnblogs.com/losesea/archive/2012/11/16/2772590.html 首先说一下什么是指针,只要明白了指针的含义,你就明白null的含义了.假设 有语句 int a=10;那么编译器就在内存中开辟1个整型单元存放变量a,我们假设这个整型单元在内存中的地址是 0x1000:那么内存0x1000单元中存放了数据10,每次我们访问a的时候,实际上都是访问的0x1000单元中的10.现在定义:int *p:                 p=&a…
1.空指针和野指针 http://blog.csdn.net/fu_zk/article/details/21030607 空指针常量 一个表示0值的整数常量,叫做空指针常量.例如:0.0L.1-1(它们都是值为0的整数常量表达式)以及(void)0.void NULL 都是空指针常量,空指针常量可以赋值给任何指针类型,因为它是变体类型(void*).但是我们更倾向于使用NULL表示这个空指针常量.对于其它方式(比如0)来表示空指针常量虽然不会产生任何问题,但是在根本意义上并不符合空指针常量的定…
        Author: JW. Zhou Date: 2014/7/2 一.空指针(0/NULL) 返回NULL和返回0是完全等价的,因为NULL和0都表示空指针,换句话说:空指针是什么,就是一个被赋值为0的指针,在没有被具体初始化前,其值为0:NULL 是一个标准规定的宏定义,用来表示空指针常量. #define NULL 0   或者 #define NULL ((void*)0) 判断一个指针是否为空指针: f(!p) 和 if(p == NULL) ,if(NULL == p)…
//最近,有朋友开玩笑问 int *p  *是指针还是p是指针还是*p是指针,当然了,知道的都知道p是指针 //野指针----->>>指没有指向一个地址的指针(指针指向地址请参考上一篇文章) //空指针---->>指向空(null)的指针就是空指针 //指针的其他用法,指针可以指向指针,指针可以进行+ - * /运算 /* 特别注意,各个编译器都不相同,这里有一种错误写法,如: int *p,int a=10,b=20; p=&b; *p = &a;    …
一.什么是空指针和野指针 1.空指针 1> 没有存储任何内存地址的指针就称为空指针(NULL指针) 2> 空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0. 下面两个都是空指针: 1 Student *s1 = NULL; 2 3 Student *s2 = nil; 2.野指针 "野指针"不是NULL指针,是指向"垃圾"内存(不可用内存)的指针.野指针是非常危险的. 二.野指针和空指针例子 接下来用一个简单的例子对比一下野指针和空指针的区别…
一.什么是空指针和野指针 1.空指针 1> 没有存储任何内存地址的指针就称为空指针(NULL指针) 2> 空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0. 下面两个都是空指针: 1 Student *s1 = NULL; 2 3 Student *s2 = nil; 复制代码 2.野指针 "野指针"不是NULL指针,是指向"垃圾"内存(不可用内存)的指针.野指针是非常危险的. 二.野指针和空指针例子 接下来用一个简单的例子对比一下野指针和空…
int *p;/*........*/delete p; p=null; 看代码的过程中,有这么一个疑问.删除了指针p,指针p既是不存在,怎么还能设置指针p为null呢?为什么还要设置为null呢? 后来得知计算机上删除数据的方式:删除数据(视频,音乐,文件等),计算机并不会把存储数据的硬盘区域(或者是内存)的内容擦除消去,而是将内容标记为可覆盖,这时候我们就不能再访问到数据,而这些可覆盖据数据会留在原来的硬盘区域直到被新的数据逐渐覆盖.(所以,删除了数据之后,只要没有对硬盘进行过多的操作,还是…
该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. 一.指针声明: 1.声明普通变量:“数据类型 + 空格 +  变量名 + :”实现普通变量的声明语句: 2.声明指针:“数据类型 + 空格 +  变量名 + :”只要在数据类型和变量名之间加一个“*"即可: 3.应用: int  var1 = 10; //声明普通变量,int是数据类型,空格作为int和var1的分割符,var1作为变量名 (1)int * ptrVar1; //*表…
一.指针的指针    指针的指针看上去有些令人费解.它们的声明有两个星号.例如:        char ** cp;    如果有三个星号,那就是指针的指针的指针,四个星号就是指针的指针的指针的指针,依次类推.当你熟悉了简单的例子以后,就可以应付复杂的情况了.当然,实际程序中,一般也只用到  二级指针,三个星号不常见,更别说四个星号了.    指针的指针需要用到指针的地址.        char c='A';        char *p=&c;        char **cp=&p…
1.      引用本身是有指针实现的:引用为只读指针 例子: int d=123; int& e=d;    //引用 int * const e=d; //只读指针,e指向d,不可修改e指向别的变量 2.      const修饰指针问题 2.1.指向const对象的指针: const double *cptr; const 所限定的是指针所指的对象,而非限定指针为const 例子: const double ip=3.14;   //ip为const型 const double *cptr…
该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. 1.指针的类型: 可以在声明指针时,指定指针的类型,例如: (1)void *x  声明一个无类型的指针,主要是在动态分配内容时,为了后期的指针转换方便,而常常使用 (2)int *ptrnum 声明一个int型的指针,一般情况下,一个指针变量自身占用4个字节,也就是32位,在64为系统下,是8个字节,也就是64位,但是随着指针的类型不同,实际的占用空间(字节)是不同的,byte型一个字节,s…
该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. 指针作为一种特殊类型的变量,必须遵守C语言中变量先声明后使用的原则.本节内容中指针的操作主要包括指针的声明.指针值的获取.指针的解引.指针的打印.指针的阅读及其他内容. 一.指针的操作: 1.指针的声明,切记指针是一种特殊变量,这种变量中没有直接存储数值,存储的数值是另外变量的地址. 其中,看代码第6.7.8行,都是指针变量的声明,无论*的位置如何,靠近int还是变量名,还是哪个都不靠近,都可…
auto_ptr是C++标准库提供的类模板,头文件<memory>,auto_ptr对象通过初始化指向由new创建的动态内存,它是这块内存的拥有者,一块内存不能同一时候被分给两个拥有者.当auto_ptr对象生命周期结束时,其析构函数会将auto_ptr对象拥有的动态内存自己主动释放. 即使发生异常,通过异常的栈展开过程也能将动态内存释放.auto_ptr不支持new数组. auto_ptr的出现,主要是为了解决"有异常抛出时发生内存泄漏"的问题.例如以下的简单代码是这类问…
写在前面: 与其说C++中的常量指针和指针常量是一块很有嚼头的语法糖,不如说它是一块相当难啃的骨头.其实本来没什么,这无非是const int *p与int* const p的区别, 但一涉及到起名字,特别是给他们戴上“常量指针”和“指针常量”的中文帽子,由于作者和译者(针对外文书)的不同,就出现了“张冠李戴”和“李冠张戴”的乱像,不知道谁是谁了,弄得人一头雾水,尤其是对于初学者.本文的目的就是针对这一细节,为大家将两者理清楚,同时说明在使用上的区别. 注意:1.const int *p也可写成…
要修改变量的值,需要使用变量类型的指针作为参数或者变量的引用.如果变量是一般类型的变量,例如int,则需要使用int 类型的指针类型int *作为参数或者int的引用类型int&.但是如果变量类型是指针类型,例如char*,那么需要使用该类型的指针,即指向指针的指针类型 char* *,或者该类型的引用类型char*&. 首先要清楚  不管是指针还是值传入函数后都会创建一个副本,函数结束后值内容不能传出来是因为值的副本,而传入的值并没被修改,指针能传出来是因为我们修改的是指针指向的内容而不…
指针和指针数组 #include<stdio.h> int main() { , b = ; int *p1 = &a , *p2 = &b ; printf("%d,%d\n",a ,b); printf("%d,%d\n",*p1,*p2); printf("%x,%x\n",&a,&b); printf("%x,%x\n",p1,p2); *p1 = *p1 * ; print…
本文参考http://www.prglab.com/cms/pages/c-tutorial/advanced-data/pointers.php http://blog.csdn.net/ameyume/article/details/8220832 1.函数指针 函数指针是一个指针,其指向的是一个函数,而不是普通的数据类型或者类对象.其定义如下: int (*func)(int a, int b); // 声明函数指针 函数指针的最大作用是将一个函数作为参数传递给另一个函数.函数指针的声明与…
面试高频题:单链表的逆置操作/链表逆序相关文章 点击打开 void init_node(node *tail,char *init_array) 这样声明函数是不正确的,函数的原意是通过数组初始化链表若链表结点传入的是指针,则并不能创建链表,除非是二维指针即指向指针的指针,或者是指向指针的引用 因为传入的虽然是指针,但是对形参的操作并不能影响实参,函数内修改的是实参的副本.要想在函数内部修改输入参数,要么传入的是实参的引用,要么传入的是实参的地址. 指向指针的引用 void init_node_…
指针可以指向基本类型,也可以指向复合类型,因此一个指针变量存放的可以是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量.由于指针变量直接指向变量,所以称为"单级间址".而如果通过指向指针的指针变量来访问变量则构成"二级间址".…
#include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <stdlib.h> int func1(int *a) {     a = new int;     *a = 1;     printf("func1 addr a=%p\n",a);     return *a; } int func2(int **a) {     *a = new int;   …
(1)是地址 首先明白一个观点:指针就是地址.这是理解指针的起始一步. 直观感受下.变量的地址 int main() { int foo; int *foo_p; foo = 5; foo_p = &foo; printf(" foo...%d\n", foo); printf("*foo_p...%d\n", *foo_p); printf(" &foo...%p\n", &foo); printf(" foo…
原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 本文由 arthinking 发表于315 天前 ⁄ itzhai.com原创文章 ⁄ C语言 ⁄ 评论数 3 ⁄ 被围观 1,775 views+   指针数组: 在一个数组中,如果它的元素全部都是指…
指针作为函数参数传递 函数参数传递的只能是数值,所以当指针作为函数参数传递时,传递的是指针的值,而不是地址. #include "stdio.h" void pointer(int *p) { int a = 11; printf("\n\nEnter function"); printf("\nthe p is point to %p , addr is %X, *p is %d",p , &p, *p); *p =11; printf…
1.数组跟指针的区别 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建.数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变. 指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存.指针远比数组灵活,但也更危险. 数组和指针特点的简单比较: 数组 指针 保存数据 保存地址 直接访问数据 间接访问数据,先取得指针的内容,然后以它为地址取得数据 用于存储数目固定且类型相同的数据 通常用于动态数据结构 编译器自动分配和删除…
指针的引用(*&)与指针的指针(**) 在下列函数声明中,为什么要同时使用*和&符号?以及什么场合使用这种声明方式? void func1( MYCLASS *&pBuildingElement ): 论坛中经常有人问到这样的问题.本文试图通过一些实际的指针使用经验来解释这个问题.仔细看一下这种声明方式,确实有点让人迷惑.在某种意义上,"*"和"&"是意思相对的两个东西,把它们放在一起有什么意义呢?. 为了理解指针的这种做法,我们先复…
 先看函数指针 int func2(int x); /* 声明一个函数 */ int (*q2) (int x); /* 声明一个函数指针 */ q2=func2;    /* 将func函数的首地址赋给指针f */ int c=(*q2)(3); //3可以为任意实参   上面4句基本说明了函数指针的用法: 函数指针是指向函数的指针,确切的说,是指向特定类型函数的指针(函数与函数指针 类型要匹配) 函数指针用来保存函数首地址,即可以通过该指针访问函数.函数指针相当于取别名. 函数指针可以指向一…
初看,UCOS 的 OSMemCreate 代码,感觉有点怪怪的,比如,把 指针指向的地址 强制转换成 指针的指针的指向地址 ?那转换后 指针的指针 又是什么? void OSMemCreate (OS_MEM *p_mem, CPU_CHAR *p_name, void *p_addr, OS_MEM_QTY n_blks, OS_MEM_SIZE blk_size, OS_ERR *p_err) { #if OS_CFG_ARG_CHK_EN > 0u CPU_DATA align_msk;…
本文转载而来,转载出处:http://www.cppblog.com/doing5552/archive/2010/09/28/127994.html 在下列函数声明中,为什么要同时使用*和&符号?以及什么场合使用这种声明方式?  void func1( MYCLASS *&pBuildingElement ): 论坛中经常有人问到这样的问题.本文试图通过一些实际的指针使用经验来解释这个问题.仔细看一下这种声明方式,确实有点让人迷惑.在某种意义上,"*"和"&…
说明:int (*p)[4] 和 int *p[4](数组指针和指针数组),如果你是一个初学者,也许当你看到这两个名词的时候,已经懵了.其实,只要你理解了其中的含义.这两个名词对你来说会相当简单并且很有趣,下面,我们就来深入探讨一下究竟什么是数组指针,什么是指针数组. 一.指针数组 1.前面我们已经学过数组了,比如说要创建一个一维整型数组,该怎么创建呢?应该是这样的:int arr[N];其中,arr是数组名,即变量名,N是你所创建的这个数组中的元素个数,而前面的int则是这些元素的类型.所以其…