指针赋值时p =3空指针异常是什么意思思

1365人阅读
定义&& & 函数指针是指指向函数而非指向对象的指针。像其他指针一样,函数指针也指向某个特定的类型(特定的函数类型)。函数类型由其返回类型以及形参表确定,而与函数名无关。如下声明了一个函数指针:&& & bool&(*pFunc)(int,&double);&&&&& & 这个语句将pFunc声明为指向函数的指针,它所指向的函数带有两个类型分别为int和double的形参及一个&bool&类型的返回值。&& & 说明:*pFunc&两侧的圆括号是必需的,否则它就变成了函数的声明,如:bool&*pFunc(int,&double);表示pFunc是一个带有两个参数(int和double)和一个bool指针类型返回值的函数。&&&&&总结,函数指针声明的一搬形式:&&&&T&(*pFunc)(T&args);&&&&pFunc为函数指针,T为数据类型,参数(T&args)可以有多个,也可以没有。&&&&&【例1】:bool IsAdult(int age, double weight)
if (age & 18 || weight & 40.0)
void TestFuncPointer()
bool (*pFunc)(int, double);
pFunc = IsA
cout && pFunc(12, 23) &&
}& & 结果&&用简化声明&&&&&我们知道可以给类型定义一个别名,函数指针本身就是一种类型,所以也可以给其定义一个别名简化基声明。如下:&&&&typedef&bool&(*FuncPointer)(int,&double);&&&&该定义表示&FuncPointer是一种函数指针类型的名字。该指针类型为“指向返回&bool&类型并带有两个(int和double)引用形参的函数的指针”。则【例1】中的使用简化为如下:&&&&【例2】:bool IsAdult(int age, double weight)
if (age & 18 || weight & 40.0)
typedef bool (*FuncPointer)(int, double);
void TestFuncPointer()
FuncPointer pFunc = IsA
cout && pFunc(12, 23) &&
}这样,如果有多个地方使用同种类型的函数指针的话,定义指向函数的指针就会简单很多。&用typedef定义函数指针的一般形式如下:&typedef&&T&(*FuncPtrType)(T&args);FuncPtrType&pFunc&=&NULL;&FuncPtrType为这一函数指针类型的别名,T为数据类型,参数(T&args)可以有多个,也可以没有;pFunc为函数指针。初始化和赋值&&&&在【例1】和【例2】中已经提到了函数指针的使用。在给函数指针赋值时,直接引用函数名等效于在函数名上应用取地址操作符,都是把函数的地址赋给函数指针变量。bool IsAdult(int age, double weight)
if (age & 18 || weight & 40.0)
bool isIntBiger(int val1, double val2)
return val1 & val2;
int GetMax(int val1, int val2)
return val1 & val2 ? val1 : val2;
typedef bool (*FuncPointer)(int, double);
void TestFuncPointer()
FuncPointer pf1 = 0;
// 初始化为0(即空指针),表示该指针不指向任何函数
FuncPointer pf2 = IsA
// 用函数名初始化函数指针
FuncPointer pf3 = isIntB // IsAdult和isIntBiger参数和返回类型都相同,所以属于相同类型的函数
// 用函数名赋值
pf1 = pf3;
// 用函数指针赋值
cout && pf1(13, 15) &&
cout && pf2(13, 56) &&
cout && pf3(18, 15) &&
//FuncPointer pf4 = GetM
// error,GetMax不是属于FuncPointer类型的函数,因为参数类型和返回值的类型都不同
}&&&&结果:011&函数指针作为函数参数&&&&&函数指针还可以作为别一个函数的形参。这种形参可以用以下三种形式中的任何一种编写:void&printBiger(int,&int,&int&(int,&int));
//等价于void&printBiger(int,&int,&int&func(int,&int));void&printBiger(int,&int,&int(*func)(int,&int)); //等价于void&printBiger(int,&int,&int(*func)(int,&int));void&printBiger(int,&int,&FuncPointerMax);
//还可以用简化的形式&【例】:int GetMax(int val1, int val2)
return val1 & val2 ? val1 : val2;
typedef int (*FuncPointerMax)(int, int);
void printBiger(int val1, int val2, int func(int, int))
cout && func(val1, val2) &&
void TestFuncPointer()
FuncPointerMax pFuc = GetM
printBiger(5, 10, pFuc);
}函数指针作为函数的返回值& & 函数指针还可以作为函数的返回值类型,其写法比较复杂,例如:&&&&&int&(*func(int))(int*,&int);&要理解这个函数指针的声明,最佳的方法是从声明的名字开始由里而外理解。func(int)&将func声明为一个函数,它带有一个int型的形参,该函数返回一个函数指针,函数指针的类型为:&&&&&int&(*)(int*,&int);&&&&&是不很难理解?那有没有易于理解的写法呢?答案是肯定的,我们同样可以用typedef&进行简化,如下:&&&&&typedef&int&(*FuncPointer)(int*,&int);&&&&FuncPointer&func(int); &欢迎加入&C/C++梦之队& 学习群:
版权声明:本文为博主原创文章,未经博主允许不得用于任何商业用途,转载请注明出处。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:749719次
积分:9776
积分:9776
排名:第803名
原创:176篇
转载:100篇
评论:461条
欢迎站内联系
转载或使用本博客原创和翻译文章,请标明出外并附上链接。
欢迎关注微信:思维与睿智
JavaQQ群:
C/C++QQ群:
文章:10篇
阅读:20853
文章:22篇
阅读:41082
文章:19篇
阅读:60795
文章:11篇
阅读:24436
文章:22篇
阅读:166665
文章:17篇
阅读:30217
(8)(4)(2)(13)(11)(8)(5)(4)(8)(1)(8)(2)(2)(3)(14)(5)(5)(10)(8)(4)(8)(9)(5)(8)(17)(4)(10)(5)(13)(13)(8)(1)(7)(6)(8)(9)(6)(7)(6)(1)(2)(3)6045人阅读
&int &x =//引用,x与z指向同一内存单元
&y = &x;//0x0012ff14&p本身所占内存单元的地址
&cout &&x&&& &&&*y&&& &&&z&&
下面是摘抄别人的一段测试程序。
void&& test(){
&&&&& int&& a=8;
&&&&& int&& *p=&a;
&&&&& p=(int&& *)malloc(N*sizeof(int));
&&& //&& printf( &%d/n &,*p);
&&& //a.&& cout & &&p;&&&&&&&&&&&&&&&&& //0x0012ff14&p本身所占内存单元的地址
&&& //b.&& cout & &*p;&&&&&&&&&&&&&&&&& //8&p所指向的内存单元的值
&&&&& c.&& cout & &p;&&&&&&&&&&&&&&&&&&&& //0x&p所指向的内存单元的地址
&&& 从测试的结果很容易看出来,*P是一个指针变量,它存储的数据是地址,并且也只能存储地址,所以在给*P赋值时,请您确认等号右边的值是不是一个地址。如果不是,那么您的程序将会出现BUG,(或许您是一位优秀的汇编写手,那么请您处理好该指针变量)。
&&& 另外还要说明的是int&& *p=&a;等价于int * p = &a;
应该注意的2点是:
1.给指针只能传地址,不能传值.否则要做强制类型转换.
2.在做类型转换和赋值时候,应该注意赋值的类型匹配.
指针与数组的区别:
很多初学者弄不清指针和数组到底有什么样的关系。我现在就告诉你:他们之间没有
任何关系!只是他们经常穿着相似的衣服来逗你玩罢了。
指针就是指针,指针变量在32 位系统下,永远占4 个byte,其值为某一个内存的地址。
指针可以指向任何地方,但是不是任何地方你都能通过这个指针变量访问到。
数组就是数组,其大小与元素的类型和个数有关。定义数组时必须指定其元素的类型
和个数。数组可以存任何类型的数据,但不能存函数。
既然它们之间没有任何关系,那为何很多人把数组和指针混淆呢?甚至很多人认为指
针和数组是一样的。这就与市面上的C 语言的书有关,几乎没有一本书把这个问题讲透彻,
讲明白了。
#include &stdio.h&
int a[5]={1,2,3,4,5};
int *ptr1=(int *)(&a+1);&&&&&&&& //a数组是一个整体,sizeof(a)=20;&a表示数组的首地址,&a+1会相当于加20个字节长度。
int *ptr2=(int *)((int)a+1);&&&& //a强制转换为int型后,相当于整数加一,所以这只是相当于地址加了一个字节。再转换为地址存入ptr2
int *ptr3=(int *)(a+1);&& //这个是大家非常熟悉的了,数组a作为左值时相当于&a[0],它加一相当于加了一个数组类型的长度,即4字节(整形)。a不能作为右值。
printf(&%x,%x,%x&,ptr1[-1],*ptr2,ptr3);
printf(&%x,%x,%x&,ptr1,ptr2,ptr3);
#include&iostream&
usingnamespace
print(int p,int q)
p&& endl&& q&&
voidset(int*&p,int*
p是引用类型,可以改变传进参数的指向& & & &&
a =10, b=20;
int*pa=&a,*pb=&b;
print(a, b); &
pa&& endl&& pb&&
pb); // pa现在指向g,但pb还是指向b,这就是引用和非引用的差别& &
print(a, b); &
print(*pa,*pb);
*&p是指针的引用,不会为p开辟空间,只是一个名字,此时相当直接对pa操作,后者开辟了个临时指针,得到pa的地址,根据指针指向地址修改pa所指向的值!两者效果是一样,但具体的实际过程有区别!
二、*&p表示什么意思
void main()
int *&p=a;
这种情况,p与a是不同的变量,这里是将a的值赋给p
即 p是a 的别名,p和a其实是同一个整形变量,两个占用同一块内存空间,如果有 p=15;那么a也是15,修改p与修改a是完全等价的
int * &p=a;
很容易理解,把 int * 看成一个类型,a就是一个整型指针,p 是a的别名
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:277869次
积分:3258
积分:3258
排名:第5334名
原创:66篇
转载:99篇
评论:25条
(2)(10)(1)(2)(8)(16)(12)(61)(38)(15)指针变量的赋值问题 float *p,m=3.14; p=&m与*p=m的区别是什么呢?都正确吗?_百度知道
指针变量的赋值问题 float *p,m=3.14; p=&m与*p=m的区别是什么呢?都正确吗?
提问者采纳
后面的那个指针没有指向地址
提问者评价
其他类似问题
为您推荐:
指针变量的相关知识
其他4条回答
p=&m是正确的,*p=m只能用在定义指针且赋初值的情况下,例如 float m=3.14; float *p=m;若只是纯粹的*p=m是错误的
有区别, float *p,m=3.14p=&m是正确的,对指针赋值嘛;*p=m是错的,因为没有对指针初始化,p指向哪里呢?使用指针首先应该告诉至真要指向哪里。。。。
前面的是地址,后面的是内容
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁第8章 指针_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
第8章 指针
阅读已结束,如果下载本文需要使用
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩6页未读,继续阅读
你可能喜欢

我要回帖

更多关于 赋值是什么意思 的文章

 

随机推荐