浅谈关于指针作为参数并改变它的值的问题

代码如下:

#include<stdio.h>
int f(int *p){
    p = p+1;
    return printf("%d\n",*p);
}
void main(){
    int a[]={1,2};
    int *p = a;//指针p是首地址
    f(p);//调用
    printf("%d",*p);//p的值是不会改变的
}

结果:
2
1
Press any key to continue

代码如下:

#include<stdio.h>
void z(int *p){
    p = p+1;
    *p = 100;
}
void mian(){
    int a[] = {1,2};
    int *p = a;
    z(p);//调用
    printf("a[1]=%d",*(p+1));//指针(p+1)所指向的内存空间中的值改变了
}

结果:
a[1]=100
Press any key to continue

通过上下这两个例子可以得出结论,指针作为参数被传递的时候,在其它函数中不能改变它的值(这个指针指向的地址),却能改变这个指针
指向的地址中的值。
  所以想要实现两个一级指针里的值交换,需要利用二级指针来实现:(指针q指向a,指针p指向b,实现q指向b,p指向a)

代码如下:

#include<stdio.h>
void exchange(int **x,int **y){
    int *temp;
    temp = *x;//*x=*qq=&a
    *x = *y;
    *y = temp;
}

void main(){
    int a =100;
    int b = 12;
//定义指针
    int *q = &a;
    int *p = &b;
    int **qq = &q;
    int **pp = &p;
//输出
    printf("q=%p\n",q);
    printf("p=%p\n",p);
    //调用函数,进行转换
    exchange(qq,pp);

printf("========改变以后的==========\n");
    printf("q=%p\n",q);
    printf("p=%p\n",p);
}

结果:
q=0012FF44
p=0012FF40
========改变以后的========
q=0012FF40
p=0012FF44
Press any key to continue

(0)

相关推荐

  • 基于指针的数据类型与指针运算小结

    1.指针的数据类型小结有关指针的数据类型 定义 含义 int i; 定义整形变量 int *p; 定义只想整型数据的指针变量p int a[n]; 定义整形数组a,它有n个元素 int *p[n]; 定义指针数组p,它由n个指向整形数据类型的指针元素组成 int (*p)[n]; 定义指向n个元素的一位数组的指针变量 int f(); f为带回整形函数值的函数 int *p(); p为带回一个指针的函数,该指针指向整形数据. int (*p)(); p为指向函数的指针,该函数返回一个整形数据 i

  • 深入解析C++中的指针数组与指向指针的指针

    指针数组定义:如果一个 数组,其元素均为指针型数据,该数组为指针数组,也就是说,指针数组中的每一个元素相当于一个指针变量,它的值都是地址. 形式:一维指针数组的定义形式为:int[类型名] *p[数组名] [4][数组长度];由于[ ]比*优先级高,因此p先与[4]结合,形成p[4]的数组的形式.然后与p前面的" * "结合," * "表示此数组是指针类型的,每个数组元素都相当于一个指针变量,都可以指向整形变量. 注意:不能写成int (*p)[4]的形式,这是指的

  • C/C++指针小结

    第一章.指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区.让我们分别说明. 先声明几个指针放着做例子: 例一: (1)int *ptr; (2)char *ptr; (3)int **ptr; (4)int (*ptr)[3]; (5)int *(*ptr)[4]; 如果看不懂后几个例子的话,请参阅我前段时间贴出的文章<<如何理解c和

  • C#委托所蕴含的函数指针概念详细解析

    原则: 1.函数指针,实际上是函数编码后的指令在内存中的首地址,在C++/C中,这个地址可以用函数名直接使用 一个函数调用另一个函数的时候,就可以把被调用函数以函数指针的形式作为参数传入 2.回调函数callback使用的技术就是函数指针: 回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用.为此,你需要做三件事: 1). 声明: 2). 定义: 3). 设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于DLL调用. 回调函数是应用程序提供给Windo

  • C语言的指针类型详细解析

    指针存储了内存的地址,同时指针是有类型的,如int*,float*,那么,一个自然的猜想就是指针变量应该存储这两方面的信息:地址和指针类型,比如,就像下面的结构体: 复制代码 代码如下: struct pointer{    long address;    int type;} 举个例子:打印sizeof(int*),值为4,可见4字节是存储内存地址用的,反过来就说明指针并没有存储类型信息的地方,那么指针的类型信息存放在哪儿呢?下面剖析一段简单的代码. 复制代码 代码如下: // ma.cpp

  • 浅析iterator与指针的区别

    1.指针和iterator都支持与整数进行+,-运算,而且其含义都是从当前位置向前或者向后移动n个位置 2.指针和iterator都支持减法运算,指针-指针得到的是两个指针之间的距离,迭代器-迭代器得到的是两个迭代器之间的距离 3.通过指针或者iterator都能够修改其指向的元素 通过上面这几点看,两者真的很像,但是两者也有着下面的几个不同地方 1.cout操作符可以直接输出指针的值,但是对迭代器进行在操作的时候会报错.通过看报错信息和头文件知道,迭代器返回的是对象引用而不是对象的值,所以co

  • C++中this指针的用法及介绍

    this指针只能在一个类的成员函数中调用,它表示当前对象的地址.下面是一个例子:   复制代码 代码如下: void Date::setMonth( int mn )     {      month = mn; // 这三句是等价的      this->month = mn;      (*this).month = mn;     } 1. this只能在成员函数中使用.全局函数,静态函数都不能使用this.实际上,成员函数默认第一个参数为T* const register this.如:

  • 函数指针的一些概念详解

    函数指针 最近看android camera 的source ,发现大量的call back ,多线程,有必要对其中的基础 :函数指针复习一下,觉得函数指针主要还是用在call back 函数,以及多线程多进程编程中.函数在被编译器编译后就是一段二进制码,而这段二进制码有一个入口地址,而这个入口地址就是函数指针的值了. 首先看函数指针的语法,举一个最简单的例子,要创建一个函数指针,则它与它指向的函数,在参数个数类型以及返回值上都保持一致,跟重载的要求应该是一样的. Int a(int a ) {

  • C/C++中指针和引用之相关问题深入研究

    一.基本知识指针和引用的声明方式:声明指针: char* pc;声明引用: char c = 'A'   char& rc = c; 它们的区别:①从现象上看,指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变.这句话可以理解为:指针可以被重新赋值以指向另一个不同的对象.但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变. ②从内存分配上看,程序为指针变量分配内存区域,而不为引用分配内存区域,因为引用声明时必须初始化,从而指向一个已经存在的对

  • C++中一维数组与指针的关系详细总结

    对于数组int a[10];a表示数组的第一个元素的地址,即&a[0]; 如果使指针p,指向数组的首元素,可以进行操作:int * p=a;或者int *p=&a[0]; 那么p++,是指向数组中的先一个元素,即a[1];此时*p则是a[1]中所放的值.此时,a[i]=p[i]=*(a+i)=*(p+i) 下面举一个例子:直接用a[i]来输出 复制代码 代码如下: #include<iostream>using namespace std;int main(){ int a[1

随机推荐