指向整型的指针和一个指向整型数的指针组的指针有什么区别

2015年11月 扩充话题大版内专家分月排行榜第一2015年7月 扩充话题大版内专家分月排行榜第一2015年1月 扩充话题大版内专家分月排行榜第一2014年9月 扩充话题大版内专家分月排行榜第一(补)2013年9月 扩充话题大版内专家分月排行榜第一2013年8月 扩充话题大版内专家分月排行榜第一2013年7月 扩充话题大版内专家分月排行榜第一
2016年3月 扩充话题大版内专家分月排行榜第二2015年12月 扩充话题大版内专家分月排行榜第二2015年6月 扩充话题大版内专家分月排行榜第二2015年2月 扩充话题大版内专家分月排行榜第二2014年10月 扩充话题大版内专家分月排行榜第二2014年8月 扩充话题大版内专家分月排行榜第二
2013年6月 C/C++大版内专家分月排行榜第三
2016年2月 C/C++大版内专家分月排行榜第三2016年1月 C/C++大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。基于指针的数据类型与指针运算小结
字体:[ ] 类型:转载 时间:
以下是对指针的数据类型与指针运算进行了详细的总结介绍,需要的朋友可以过来参考下
1.指针的数据类型小结有关指针的数据类型
定义整形变量
定义只想整型数据的指针变量p
定义整形数组a,它有n个元素
int *p[n];
定义指针数组p,它由n个指向整形数据类型的指针元素组成
int (*p)[n];
定义指向n个元素的一位数组的指针变量
f为带回整形函数值的函数
p为带回一个指针的函数,该指针指向整形数据。
int (*p)();
p为指向函数的指针,该函数返回一个整形数据
p为一个指向指针的指针变量,它指向一个整形数据的指针变量2.指针的运算小结(1)指针变量的赋值 代码如下:int *pp=&a;将变量a的地址赋给p 代码如下:int a[3]={1,2,3};int *p;p=a;将数组首元素的地址赋给指针p 代码如下:int a[3]={1,2,3};int *p;p=&a[2];将数组中的元素的地址赋给指针p 代码如下:int main(){&&& int& f(int z);&&& int (*p)(int z);&&& p=f;&&& p(5);}int f(int z ){cout&&z&&}f为已经定义的函数,将f的入口地址赋给p 代码如下:int a=3;int *p1=&a;int *p2=p1;p1和p2是同类型的指针,将p1的值赋给p2
(2)指针变量赋空值指针变量可以有空值,即该指针变量不指向任何变量,可以这样表示: 代码如下:p=NULL;实际上NULL代表整数0,也就是使p指向地址为0的单元。这样可以使指针不指向任何有效的单元。实际上系统已经定义了NULL: 代码如下:#define NULL 0C++中在iostream头文件中就包括了以上的NULL定义,NULL使一个符号常量。在C-free编辑器中运行: 代码如下:#include&iostream&int main(){&cout&&NULL;&cout&&}应注意,p的值等于NULL和p未被赋是两个概念。前者是有值得(值为0),不指向任何变量,后者虽未对p赋值但并不等于p无值,只是它的值是一个无法预料的值,也就是p可能指向某一个未指定的单元。这种情况是非常危险的。因此,在饮用变量之前一定要对其进行赋值。
任何指针变量或地址都可以与NULL做相等或者不等的比较: 代码如下:if(p==NULL)p=p1;上面的语句还可以写成: 代码如下:if(!p)p=p1;还应注意int *p=NULL;和int *p;*p=NULL;的区别:int *p=NULL是定义了一个指向整形变量的指针,并且对该指针进行了初始化操作,赋初始值为NULL;而int *p;是定义了一个指向整形变量的指针,因为没有对该指针进行初始化,所以它可能指向任何一个值,因此可能指向一个非法的值,例如系统内存中的变量。然后*p =NULL;是使p所指向的变量的值为0,因为p所指向的值是不确定的,所以该操作是十分危险的。
(3)指针变量的赋值应该注意的问题我们知道基类型相同的不同的指针变量之间可以赋值。不同的的基类型的变量之间是不可以进行赋值的。运行代码: 代码如下:#include&iostream&int main(){&span style="white-space:pre"&&&/span&int *p1,i=5;&span style="white-space:pre"&&&/span&double *p2 ,j=2.5;&span style="white-space:pre"&&&/span&p1=&i;&span style="white-space:pre"&&&/span&p2=&j;&p1=p2;&&& cout&&*p1&&&&& return 0;}编辑器提示:
可以通过强制类型转化实现上述赋值: 代码如下:#include&iostream&int main(){&int *p1,i=5;&double *p2 ,j=2.5;&p1=&i;&cout&&*p1&&&p2=&j;&cout&&*p2&&&p1=(int *)p2;&&& cout&&*p1&&&&& return 0;}虽然,上述操作不再报错,但是指针的强制类型转发生了数据截断,所以仍然得不到理想的结果:
关于指针的强制类型转换(4)指针变量加/减一个整数
例如: 代码如下:p++;p--;p+i;p-1;p+=i;p-=i;C++规定,一个指针变量加/减一个整数是将该指针变量的原值(原来指向的地址)和它指向的变量所占用的内存单元字节数相加或者相减。如p+i;代表这样的地址计算:p+i*d,d是p所指向的变量单元所占用的字节数。这样才能保证p+i指向p下面的第i个元素。
(5)两个指针变量相减如果两个指针指向的同一个数组中的元素,则两个指针变量之差是两个指针变来那个之间的元素的个数。 代码如下:#include&iostream&int main(){&int a[10]={1,2,3,4,5,6,7,8,9,10};&int *p1=&a[3];&int *p2=&a[5];&cout&&(p2-p1)&&&cout&&(p1-p2)&&&return 0;}运行结果:(6)两个指针变量比较 若两个指针指向同一个数组的元素,则可以进行比较大小。指向前面元素的指针变量小于指向后面元素的指针变量。 代码如下:#include&iostream&int main(){&int a[10]={1,2,3,4,5,6,7,8,9,10};&int *p1=&a[3];&int *p2=&a[5];&if(p1&p2){&&cout&&"p1&p2"&&&}else{&&cout&&"p1&=p2"&&&}&return 0;}结果输出:
还可以利用这个性质,输出数组中的所有的元素: 代码如下:#include&iostream&int main(){&int a[10]={1,2,3,4,5,6,7,8,9,10};&int *p=a;&&& while(p&a+10){&&& &cout&&*p&&&&& &p++;&&& }&return 0;}输出结果:
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具博客访问: 2320750
博文数量: 409
博客积分: 10227
博客等级: 上将
技术积分: 9496
注册时间:
认证徽章:
非淡泊无以明志,非宁静无以致远
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
char str[20], *
ptrstrptrstr
int a[10], *
Cp=&a[0]p=a
paapaaaaaa=10papapa=10
a[i]*(ai)<>[<>]*(<><>)**<>=<>C
c[i][j][k]*(*(*(ci)j)k)
int a[3][4];
*(*(p1)2)a[1][2]*pa[0][1]ppp1p2pa[0][1]
pjp=a[0]pa[0][1]a[1]p
\0\0ASCII0CC
void func(int A[])
&&&&& //sizeof(A)4bytes
int main()
&&& int a[10]; //sizeof(a) 40bytes
&&& funct(a);
&& int intArray[10];
&& intArray++;
WIN32sizeof4
sizeofsizeof(int)sizeofC/C++int""
char a[3] = "abc";
strcopy(a,"end");
-------------------
-----------------
char *a = "abc";
strcopy(a,"end");
------------------
char *a = "abc"; &abca
strcpy(a, "end")a
char *a = new char[4];
strcpy(a, "end");&&
printf("%s", a);
delete []a;
4//main.cpp
int array[3] = {7, 8, 9}; //
int main()
//Test1.cpp
extern int array[3];
void Test1()
cout << array[1] <<
//Test2.cpp
extern int * //
void Test2()
cout << array <<
cout << array[1] <<
Test1()Test2()
Test27 Test1()
Test1.cppexternarraymain.cpparrayint i = 5;50x8291
5i0x8291ii
Test1.cpparrayarray,0x34fearray == &arrayTest2.cpparray,0x34fearrayarray = 0x0007(,)
Test2()array[1]0x0007
char *p= "hello ";
,(section) "hello ",(, char *q= "hello ",p)
char a[]= "hello ";
,(section),
char *p= "hello ";
,(section) "hello ",(, char *q= "hello ",p),,,,,.
char a[]= "hello ";
printf( "%s\n ", "hello ");
( "%s\n " "hello "),
,char*p= "xxx ".
阅读(10752) | 评论(2) | 转发(7) |
相关热门文章
给主人留下些什么吧!~~
这个下面的解释没怎么理解。因为如果在main函数中定义一个int&*p=来操作,是完全没有问题的。
4//main.cppint&array[3]&=&{7,&8,&9};&//全局变量int&main(){Test1();Test2();return&0;}//Test1.cppextern&int&array[3];void&Test1(){cout&&&&array[1]&&&&}//Test2.cppextern&int&*&//这个地方是不同的void&Test2(){cout&&&&array&&&&cout&&&&array[1]&&&&}这个下面的解释没怎么理解。因为如果在main函数中定义一个int&*p=来操作,是
请登录后评论。}

我要回帖

更多关于 指向整型数组的指针 的文章

更多推荐

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

点击添加站长微信