精华内容
下载资源
问答
  • 修改指针指向的地址
    千次阅读
    2019-11-04 08:32:04
    #include<stdio.h>
    
    void f(int *p);
    void ff(int ** q);
    int main(){
    	int i = 10;
    	int *p = &i;
    	printf("%d\n",i);
    	f(&i);//想要修改i的值,需要传递i的地址过去
    	printf("%d\n",i);
    	
    	printf("%p\n",p);
    	ff(&p);//如果想修改p的值,则需要传递p的地址过去。
    	printf("%p\n",p);
    }
    void ff(int ** q){//如果传递的是一个指针变量的地址,函数形参中带两个*。这里的q是一个指针的指针
    	*q=(int *)0x123;//无论是变量的指针还是指针的指针,要想修改指针所指向地址值的内容,只需在指针前加一个*号
    }
    
    
    void f(int *p){//如果传递的是一个普通变量的地址,函数形参中带一个 *。这里的p是一个变量的指针
    	*p=20;//p是一个指针变量,要想改变p指向地址的值要用*p
    }
    
    更多相关内容
  • 需求:通过函数修改指针pointtodefine,使其指向自定义的类MyClass。 方法:需要将指向该指针的指针作为参数传递给函数,再在函数中修改(即指针的指针作为参数传递给函数) //函数定义 void user(void ** ...

    修改指针地址:一般可直接将指针赋值为目标类的地址

    void* pointtodefine=new MyClass();

     

    通过函数修改指针指向的地址

    有些场景需要通过函数修改指针pointtodefine,使其指向自定义的类MyClass。(例如,仅函数为留给用户的接口)

     

    注意:对于函数参数是通过值传递的情况,如果函数参数为指针的话,将实参指针传递给函数形参,相当于拷贝了实参,在函数内部修改指针地址不会影响原来实参指针的地址。但是,如果在函数内部修改指针指向的值,则实参指针指向的值也随之更改。

     

    总结:指针作为函数的参数,在函数中只能修改指针指向的值,无法实现修改实参指针的地址;指针的指针作为函数参数,在函数内部可以实现修改实参指针的地址。

    方法:需要将指向该指针的指针作为参数传递给函数,再在函数中修改(即指针的指针作为参数传递给函数)。图示化过程如下:

    具体代码如下:

    //函数定义
    void user(void ** ppanonymity){
        MyClass* target=new MyClass();
        *ppanonymity=target;
    }
    
    int main(){
        //调用方法
        void* pointtodefine=null;
        user(&pointtodefine);
        return 0;
    }
    

    它实现的作用还是

    void* pointtodefine=new MyClass();
    展开全文
  • 也就是说,如果我们想要对一个自己构造的某个结构体类型的指针初始化的话,我们必须让这个指针指向一个该类结构体的一个变量。 终于在我的不断思索下做了如下修改,程序终于正常了。 int main() { PCB PA; PCB *Q...

    Debug C

    问题背景:在一次操作系统模拟实验中,我构造了一个PCB结构体,它包括几个变量:名称(字符串)、到达时间(整形)。。。

    typedef struct pcb {
    	char pname[N];                 //进程名
    	char state;					  //状态(就绪R,等待W,完成C)
    	int apply;					  //当前申请量	
    	int need;					  //资源需求总量
    	int occupy;					  //已占资源量
    	int isaccomplish;			  //能执行完标志
    }PCB;
    

    问题简述:我构造了一个初始化函数想要手动输入各个PCB的内容,在我输入PCB的名称时,却总是报错,程序被中断执行。

    注意:以下代码在编译时是没有问题的。

    void initpcb(PCB *P) {
    	printf("Please input current PCB's name :");
    	scanf_s("%s",P->pname,N);                      
    	printf("\nPlease input current %s 's apply :",P->pname);
    	scanf_s("%d",&P->apply);
    	printf("\nPlesae input current %s 's occupy :", P->pname);
    	scanf_s("%d", &P->occupy);
    	printf("\nPlease input current %s 's need :", P->pname);
    	scanf_s("%d", &P->need);
    	printf("\n%s create Achieve!", P->pname);
    }
    
    int main(){
    PCB *P;
    initpcb(P);
    getchar();
    getchar();
    return 0;
    }
    

    进入运行画面

    在这里插入图片描述
    在我输入了PCB名称 A后,出现了报错。
    在这里插入图片描述

    如图所示,上面显示0xC0000005写入位置0xCCCCCCCC时发生访问冲突。

    这种异常提示往往是在你使用了指针的时候遇到的,原因大概有两种:

    1. 使用了未初始化的指针。
    2. 使用了已经删除的指针。
      确实我的指针一开始并没有初始化,只是直接提出。于是我决定用NULL来初始化我的指针P。
    PCB *PA=NULL; 
    

    可是万万没想到的是,程序依然报错了!

    在这里插入图片描述Expression:buffer != nullptr

    VS说缓冲区不能等于空指针。也就是说我们不能用NULL来初始化我们的指针,这是为什么呢?

    原来当我们把指针置为NULL时,系统并没有给这个指针分配内存空间,这样我在接下的函数里调用这个指针时,系统并不能对它做任何改变。
    也就是说,如果我们想要对一个自己构造的某个结构体类型的指针初始化的话,我们必须让这个指针指向一个该类结构体的一个变量。

    终于在我的不断思索下做了如下修改,程序终于正常了。

    int main() {
    	PCB PA;
    	PCB *Q = &PA;
    	initpcb(Q);
    	getchar();
    	return 0;
    }
    

    他可以成功接收一个字符了。
    在这里插入图片描述

    回顾一下指针的含义:

    指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址

    经过上面的调试让我对指针的初始化有了更深的理解,那么换个角度思索一下,我是不是可以在函数调用指针的时候转换一下思路,直接在函数括号中输入这个变量的地址不就可以避免这种问题了吗~于是我做了如下调试:

    int main() {
    	PCB PA;	
    	initpcb(&PA);
    	getchar();
    	return 0;
    }
    

    在这里插入图片描述

    终于这个问题成功解决了~!

    头发-1
    能力+1…

    如果这篇文章对你有所帮助~
    欢迎关注我的公众号夏虫不可语冰也
    这里有更多你需要的信息哦~
    夏虫不可语冰也

    展开全文
  • 下面看下将指针指向特定的内存地址: #include <stdio.h> struct Data{ char length; char width; short height; }; int main() { char buf[12] = {0}; buf[4] = 0x12; buf[5] = 0x34; buf[6] = 0...

      C语言指针是一个很灵活的东西,使用指针可以提高效率,但同时指针也是很危险的,弄不好就容易使得程序崩溃。下面看下将指针指向特定的内存地址:

    #include <stdio.h>
    
    struct Data{
    	char length;
    	char width;
    	short height;
    }; 
    
    int main()
    {
    	char buf[12] = {0};
    	
    	buf[4] = 0x12;
    	buf[5] = 0x34;
    	buf[6] = 0xab;
    	buf[7] = 0x23;
    	
    	struct Data *realData = (struct Data *)(buf + 4*sizeof(char));
    	printf("realData->length = 0x%x\n", realData->length);
    	printf("realData->width = 0x%x\n", realData->width);
    	printf("realData->height = 0x%x\n", realData->height);
    	
    	return 0;	
    }
    

      我们首先定义一个结构体,包含长宽高三个成员,同时也定义了一块buf缓存,并且将数据填充进去。然后我们定义一个结构体指针,这个指针指向以buf为首地址的后面第4个内存地址处,这时结构体的成员就可以对应起来了,所以printf打印的数据就是结构体指针指向的buf数组对应成员数据。可以想象一下内存中的对应关系(我们测试的机器环境是小端模式,字节序的大小端模式可以参考《C语言:字节序的大小端模式》):

    在这里插入图片描述

    运行程序可以看到结果与我们的内存对应关系是一致的:

    realData->length = 0x12
    realData->width = 0x34
    realData->height = 0x23ab
    

      还没结束哦,必须注意的一点就是使用结构体的时候,需要了解结构体内部的成员在内存中的分布关系,否则得到的数据就不一定是正确的了,比如我们修改一下程序,将结构体成员的顺序调换一下并且相应调整buf的元素:

    #include <stdio.h>
    
    
    struct Data{
    	char length;
    	short height;
    	char width;
    }; 
    
    
    int main()
    {
    	char buf[10] = {0};
    	
    	buf[4] = 0x12;
    	buf[5] = 0xab;
    	buf[6] = 0x23;
    	buf[7] = 0x34; 
    	
    	struct Data *realData = (struct Data *)(buf + 4*sizeof(char));
    	printf("buf start in RAM addr: %p\n", &buf[0]);
    	printf("realData->length addr: %p, val: 0x%x\n", &realData->length, realData->length);
    	printf("realData->height addr: %p, val: 0x%x\n", &realData->height, realData->height);
    	printf("realData->width  addr: %p, val: 0x%x\n", &realData->width, realData->width);
    
    	return 0;	
    }
    

    先看答案再解释:

    buf start in RAM addr: 0xbea84d52
    realData->length addr: 0xbea84d56, val: 0x12
    realData->height addr: 0xbea84d58, val: 0x3423
    realData->width  addr: 0xbea84d5a, val: 0x0
    

      输出的结果和我们设定的数据是不一样的了,不可否认的一点是,我们的数据存放到buf中的位置是正确的,但是结构体内部成员的关系可就不是连续的4个地址空间了,不信可以看一下上面打印的地址数一下。还是把内存图画出来会比较容易对上号:

    在这里插入图片描述
      由于结构体成员存在内存对齐问题(本程序在32位机器上运行),结构体本身占用的内存就发生了变化,至于为什么会这样可以参考文章:《C语言:结构体大小及其成员分布探究(结构体内存对齐问题)》,里面讲解了结构体内存分布的好几种情况。所以看到以上内存分布对应关系,知道程序应该怎么改了吧?只需要将buf的下标调整一下配合结构体成员分布即可输出正确结果:

    buf[4] = 0x12;
    buf[6] = 0xab;
    buf[7] = 0x23;
    buf[8] = 0x34; 
    
    展开全文
  • 这里主要是指的是字符串指针 比如 ``` 比如 char s1[]="hello";...就是想通过修改指针指向来做 ``` 这个可以实现么 不要函数不要循环复制 为什么不能让s+5=t,就是让它接下来指向t的地址
  • C语言通过函数调用改变指针指向

    千次阅读 2021-08-10 17:28:15
    fun1()函数接收的是s1和s2的地址,所以p1、p2分别指向s1、s2所在的地址,此时我们执行*p1 = *p2,才能修改主函数中s1所储存的值,成功地修改s1的指向,将其指向s2指向地址。如果我们想要通过函数调用,改变指针的...
  • #include <iostream> using namespace std; int main() { cout<<"开始运行了"<<endl; int a = 2, b = 3, c = 4; int *p = &... //改变*p指针所指对象的值 //下面这一句,把a的值
  • C语言指向数组元素的指针

    千次阅读 2021-05-21 16:26:57
    指向数组元素的指针和运算法则所谓指向数组元素的指针,其本质还是变量的指针。因为数组中的每个元素,其实都可以直接看成是一个变量,所以指向数组元素的指针,也就是变量的指针指向数组元素的指针不难,但很常用...
  • 指针指向内存free后指针指向哪里

    千次阅读 2020-04-28 23:36:21
    #include"stdio.h" #include"stdlib.h" ...//现在指针指向位置是NULL ptr = (int *)malloc(10);//假设分配的内存空间地址为0x0024FF24 printf("%f",ptr); free(ptr);//现在ptr'指向的地址还是0x0024FF...
  • 当函数的形参为结构体指针,但是在函数中不仅修改指针指向的值,而且修改指针指向地址 以下可以改变主函数中a的值,但是a指向的地址不会发生改变 struct student { int aa; int bb; student() {} student(int ...
  • 文章目录C++类的对象和类的指针的区别指向地址指针指针本身的大小指向数组的指针指针数组指向指针数组的指针多维指针数组函数参数中使用指针数组指针传址实现数组求和函数指针模仿C++ 类别函数指针数组对象指针...
  • c/c++向函数传递指针修改指向的问题

    千次阅读 多人点赞 2018-09-09 23:38:45
    而如果想要通过改变指针指向的方法来达到交换值的目的,一种想法是把swap函数修改为: void swap ( int *p1, int *p2) { int *p; p = p1; p1 = p2; p2 = p; } 方法看似很正确,但是很遗憾,执行完swap...
  • 特点:指针的指向不可以修改指针指向的内存的值可以修改 举例: *p = 20; p=&b; 常量指针 int a = 10; int b = 10; const int *p=&a; 特点: 指针的指向可以修改,但是指针指向的值不可以修改。 ...
  • 为什么一个指针变量作为形参传递给一个函数后,在函数体内改变这个指针指向,但函数结束后这个指针指向没有发生变化? 现在有如下一段代码,其中指针p指向a,a的值为10,接着调用Fun函数,Fun函数的意图是将...
  • const指针指向const的指针

    千次阅读 2021-10-09 21:51:47
    参考const 指针指向const的指针 const的理解、const指针指向const的指针 首先对于普通的const常量,必须在声明的时候初始化,否则会报错。 const int a = 100; 而对于const指针来说,根据const与*的相对位置...
  • 父类指针指向子类实例对象,对于普通重写函数时,会调用父类中的函数。而调用被子类重写虚函数时,会调用子类中的函数。 这是因为子类中被重写的虚函数的运行方式是动态绑定的,与当前指向类实例的父类指针类型无关...
  • 我是想把字符串内容修改为‘xx’,但是在只能修改形参的内容无法修改实参的内容,请问replaceSpace这个函数该如何修改才能在main函数调用后把它的字符串修改为‘xx’,谢谢。 ``` class Solution { public: void ...
  • 修改指针指向的QVector内部成员的值

    千次阅读 2017-11-29 13:50:05
    指针容器改变内部元素的值
  •   同理,我们先不讲技术,先从字面意思来理解:指针常量、常量指针、函数指针指针函数、数组指针指针数组 指针常量 指针是定语,常量是中心词,所以指针常量本质是一个常量 常量指针 常量是定语,指针...
  • 目录 到底什么是指针呢? 指针 指针地址和指针类型 指针取值 ...内存就是一系列有序列号的存储单元,变量就是...指针指向变量的内存地址,指针就像该变量值的内存地址一样 我们来看一个代码片段 func main() { ...
  • 如何在子函数中修改主函数中...那么修改指针也是一样的,修改指针,那么我们就需要在子函数的形参列表中定义一个指向指针的指针,通过在主函数中调用子函数并且将指针的地址作为实参调用子函数,这样就可以在子函数...
  • C++基类指针指向派生类(指针)

    千次阅读 2019-11-27 15:45:45
    我们常用基类指针指向派生类对象来实现多态性。 基类指针只能访问到基类中含有的公有成员。 成员如果是数据成员的话访问的是基类的版本(如果派生类中含有相同名字的数据成员的话)。 对于已经被重写的方法成员...
  • 修改const指针指向的值

    千次阅读 2014-11-21 15:33:43
    如果指向const的指针所指的对象并非const,则可直接给该对象赋值或间接地利用普通的非const指针修改其值,毕竟这个值不是const。 注:不能保证指向const的指针所指的对象的值一定不可修改。 在实际程序中,...
  • 目录指向字符串的指针为何不能用来修改此字符串为何char a[ ]可以修改字符串 指向字符串的指针为何不能用来修改此字符串 如上图操作,指向字符串的指针不能用来修改此字符串,会出错。 这是因为: char *p="hello...
  • 地址指针指针变量详解

    千次阅读 2021-11-10 00:34:39
    指针就是地址地址就是指针地址就是内存单元的编号。 指针变量就是存放内存地址的变量。 指针指针变量是两个不同的概念,但要注意的是,通常我们叙述时会把指针变量简称为指针,实际他们含义并不一样。 ...
  • golang指针修改

    千次阅读 2019-05-18 10:55:00
    golang指针修改值 package main import "fmt" func main(){ x,y := 1,2 swap(&x,&y) fmt.Println(x,y) } func swap(a,b ...
  • 比如p为一个指针 p->num+=1; 怎么可以改变p->num; 上面的运算是想要达到的目的,但运行不成功,因为不可以只能赋值给一个左值,不能给表达式
  • C语言复习之改变变量的指针地址

    千次阅读 2021-05-02 10:26:59
    修改NULL值的指针指向 基本理念 传递一个比原来指针更高一级的指针即可,然后在函数中使用*原来指针变量=地址值即可 2.一个基本的字符指针的修改demo #include <stdlib.h> #include <stdio.h> #...
  • 问题原因:指针指向常量字符串(位于常量存储区),常量字符串的内容是不可以被修改的,企图修改常量字符串的内容而导致运行错误。所以这个问题出现的原因是char*str=”abcdefg”,赋值的是字符串常量,存储在常量存储区...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 507,161
精华内容 202,864
关键字:

修改指针指向的地址

友情链接: captureScreen.rar