c语言指针之二级指针示例 二级指针的概念 首先任何值都有地址,一级指针的值虽然是地址,但这个地址做为一个值亦需要空间来存放,是空间就具有地址,这就是存放地址这一值的空间所具有的地址,二级指针就是为了这个地址,一级指针所关联的是其值(一个地址)名下空间里的数据,这个数据可以是任意类型并做任意用途,但二级指针所关联的数据只有一个类型一个用途,就是地址,指针就是两个用途提供目标的读取或改写,那么二级指针就是为了提供对于内存地址的读取或改写指针的表现形式是地址,核心是指向关系指针运算符“*”的作用是按照指向关系访问所指向的对象.如果存在A指向B的指向关系,则A是B的地址,“*A”表示通过这个指向关系间接访问B.如果B的值也是一个指针,它指向C,则B是C的地址,“*B”表示间接访问C如果C是整型、实型或者结构体等类型的变量或者是存放这些类型的数据的数组素,则B(即C的地址)是普通的指针,称为一级指针,用于存放一级指针的变量称为一级指针变量。A(即B的地址)是指向指针的指针,称为二级指针,用于存放二级指针的变量称为二级指针变量.根据B的不同情况,二级指针又分为指向指针变量的指针和指向数组的指针 二级指针的分类 指向指针变量的指针 在如上的A指向B、B指向C的指向关系中,如果A、B、C都是变量,即C是普通变量,B是一级指针变量,其中存放着C的地址,A是二级指针变量,其中存放着B的地址,则这3个变量分别在内存中占据各自的存储单,它们之间的相互关系下图所示,相互之间的前后位置关系并不重要.此时,B是一级指针变量,B的值(即C的地址)是一级指针数据;A是二级指针变量,A的值(即B的地址)是二级指针数据. 指向数组的指针 在C语言中,数组与其它变量在使用上有很大的不同.无论是字符型、整型、实型变量,还是结构体类型或者指针类型的变量,语句中出现变量名都代表对该变量所在内存单的访问,变量名代表整个变量在内存中的存储单,可以向该变量赋值,也可以从中取出数据使用.但是定义一个数组之后,数组名并不代表整个数组所占据的内存单,而是代表数组首素的地址. 二级指针例子: 复制代码 代码如下: int *q; //定义一个一级指针变量,它指向一个普通变量(即它存的是一个变量的地址) int p; //定义一个二级指针变量,它指向一个指针变量(它存的也是一个变量地址,只不过是一个指针变量的地址) int s; q = &s; //q中存的是整型变量s的地址,所以q是一级指针 p = &q; //p中存的是一级指针q的地址,所以p是二级指针 例子: 复制代码 代码如下: # include <stdio.h> void f(int q); int main(void) { int i = 9; int * p = &i;// int *p; p = &i; printf(“%p ”, p); f(&p); printf(“%p ”, p); return 0; } void f(int q) { *q = (int *)0xFFFFFFFF;// 这里是更改了p的值,与i无关,p不再指向i } 1、二级指针的相关问题 复制代码 代码如下: #include “iostream” #include “string” #include “cmath” using namespace std; int main() { char ch=’a’; char *p1=&ch; char p=&p1; cout<<ch<<endl; cout<<p1<<endl; cout<<&ch<<endl; cout<<*p1<<endl; cout<<p<<endl; cout<<p<<endl; char *p3=NULL; //cout<<p3<<endl; //cout<<*p3<<endl; char p4=&p3; cout<<p4<<endl; //cout<<*p4<<endl; cout<<p4<<endl; } 思考上面的输出是什么? 2、如下程序,输出是什么? 复制代码 代码如下: #include “iostream” using namespace std; int main() { int a=12; int *p=&a; int p1=&p; cout<<a<<endl; cout<<&a<<endl; cout<<p<<endl; cout<<*p<<endl; cout<<p1<<endl; cout<<*p1<<endl; cout<<p1<<endl; } 3、如下程序的输出是什么? 复制代码 代码如下: #include “iostream” using namespace std; int main() { int *p=NULL; int p1=&p; cout<<p<<endl; //cout<<*p<<endl; cout<<p1<<endl; cout<<*p1<<endl; cout<<p1<<endl; } void GetMM(char p,int n){ if(*p!=NULL) *p=(char*)malloc(n); (*p)[1]=’a’; } int main() { char *str=NULL; GetMM(&str,10); } #include “iostream” using namespace std; union A{ int b; char ch[2]; }; int main() { A a; a.ch[0]=0x38; a.ch[1]=0x39; printf(“%x”,a.b);//3938 } 您可能感兴趣的文章:C语言指针详解及用法示例C语言 用指针作为函数返回值详解C语言的指针类型详细解析详解C语言结构体中的函数指针C语言入门之指针用法教程C语言 指针与二维数组详解C语言指针的长度和类型深入分析C语言 结构体和指针详解及简单示例C语言指针学习经验总结浅谈带你分分钟玩转C语言指针
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/65121.html