精华内容
下载资源
问答
  • 这里主要是指的是字符串指针 比如 ``` 比如 char s1[]="hello";...就是想通过修改指针指向来做 ``` 这个可以实现么 不要函数不要循环复制 为什么不能让s+5=t,就是让它接下来指向t的地址
  • 为什么p[1]=3;不是s.p指向内存地址。为什么s.p[1]=3;不是s.p指向内存地址
  • 也就是说,如果我们想要对一个自己构造的某个结构体类型的指针初始化的话,我们必须让这个指针指向一个该类结构体的一个变量。 终于在我的不断思索下做了如下修改,程序终于正常了。 int main ( ) { PCB ...

    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…

    展开全文
  • 打印指针指向地址

    千次阅读 2019-01-08 08:45:58
    每次输出的地址值都是一样的,自然想到其实输出的是指针变量的地址值,指针变量是没有变化的变化的是指向的内存地址修改,新的代码如下: static void print_cpu_src(uint8_t * src, int stride){ ...

    废话不多说,直接上错误代码:

    static void print_cpu_src(uint8_t * src,int stride){
        int i,j;
        printf("Magnum  cpu src addr == %p, stride ==%d:\n",&src,stride);
         for (i = 0; i < 11; ++i) {
                 printf("\n");
                for (j =0; j < 4; ++j) {
                              printf("%d ,", src[j]);
                }
                src +=  stride;
                printf("new src addr %p\n",&src);
              }
         printf("\n");
    }
    View Code

    输出结果:

    Magnum cpu src addr == 000000000022F4C0, stride ==800:

    129 ,124 ,122 ,124 ,new src addr 000000000022F4C0

    130 ,125 ,122 ,125 ,new src addr 000000000022F4C0

    132 ,125 ,123 ,125 ,new src addr 000000000022F4C0

    132 ,126 ,123 ,125 ,new src addr 000000000022F4C0

    151 ,127 ,124 ,126 ,new src addr 000000000022F4C0

    151 ,127 ,125 ,126 ,new src addr 000000000022F4C0

    153 ,128 ,125 ,127 ,new src addr 000000000022F4C0

    154 ,128 ,125 ,127 ,new src addr 000000000022F4C0

    157 ,129 ,125 ,127 ,new src addr 000000000022F4C0

    158 ,129 ,125 ,127 ,new src addr 000000000022F4C0

    161 ,130 ,125 ,128 ,new src addr 000000000022F4C0

    每次输出的地址值都是一样的,自然想到其实输出的是指针变量的地址值,指针变量是没有变化的变化的是指向的内存地址。

    修改,新的代码如下:

    static void print_cpu_src(uint8_t * src,int stride){
        int i,j;
        printf("Magnum  cpu src addr == %p, stride ==%d:\n",(int)src,stride);
         for (i = 0; i < 11; ++i) {
                 printf("\n");
                for (j =0; j < 4; ++j) {
                              printf("%d ,", src[j]);
                }
                src +=  stride;
                printf("new src addr %p\n",(int)src);
              }
         printf("\n");
    }
    View Code

    总结:

    其实指针 *src,  src 就是指向的地址值,直接打印它即可

    展开全文
  • 需求:通过函数修改指针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();
    展开全文
  • 二级指针指向指针指针

    千次阅读 多人点赞 2019-09-26 11:27:52
    如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针。 假设有一个 int 类型的变量 a,p1是指向 a 的指针变量,p2 又是指向 p1 的指针变量,它们的关系如下图所示: 将这种关系转换为...

    指针可以指向一份普通类型的数据,例如 int、double、char 等,也可以指向一份指针类型的数据,例如 int *、double *、char * 等。

    如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针。

    假设有一个 int 类型的变量 a,p1是指向 a 的指针变量,p2 又是指向 p1 的指针变量,它们的关系如下图所示:

    C语言二级指针(指向指针的指针)演示图

    将这种关系转换为C语言代码:

    int a =100;
    int *p1 = &a;
    int **p2 = &p1;

    指针变量也是一种变量,也会占用存储空间,也可以使用&获取它的地址。C语言不限制指针的级数,每增加一级指针,在定义指针变量时就得增加一个星号*。p1 是一级指针,指向普通类型的数据,定义时有一个*;p2 是二级指针,指向一级指针 p1,定义时有两个*

    如果我们希望再定义一个三级指针 p3,让它指向 p2,那么可以这样写:

    int * * * p3= &p2;

    四级指针也是类似的道理:

    int ****p4=&p3;

    实际开发中会经常使用一级指针和二级指针,几乎用不到高级指针。

    想要获取指针指向的数据时,一级指针加一个*,二级指针加两个*,三级指针加三个*,以此类推,请看代码:

    #include <stdio.h>
    
    int main(){
        int a =100;
        int *p1 = &a;
        int **p2 = &p1;
        int ***p3 = &p2;
    
        printf("%d, %d, %d, %d\n", a, *p1, **p2, ***p3);
        printf("&p2 = %#X, p3 = %#X\n", &p2, p3);
        printf("&p1 = %#X, p2 = %#X, *p3 = %#X\n", &p1, p2, *p3);
        printf(" &a = %#X, p1 = %#X, *p2 = %#X, **p3 = %#X\n", &a, p1, *p2, **p3);
        return 0;
    }

    运行结果:

    100, 100, 100, 100
    &p2 = 0X28FF3C, p3 = 0X28FF3C
    &p1 = 0X28FF40, p2 = 0X28FF40, *p3 = 0X28FF40
     &a = 0X28FF44, p1 = 0X28FF44, *p2 = 0X28FF44, **p3 = 0X28FF44

    以三级指针 p3 为例来分析上面的代码。***p3等价于*(*(*p3))。*p3 得到的是 p2 的值,也即 p1 的地址;*(*p3) 得到的是 p1 的值,也即 a 的地址;经过三次“取值”操作后,*(*(*p3)) 得到的才是 a 的值。

    假设 a、p1、p2、p3 的地址分别是 0X00A0、0X1000、0X2000、0X3000,它们之间的关系可以用下图来描述:

    C语言多级指针演示图

    方框里面是变量本身的值,方框下面是变量的地址。

    展开全文
  • 3种与const、指针及指针指向的对象有关的情形: 1.指向常量对象的指针 2.指向某个对象的常量指针 ...在第二种情况中,我们不能修改指针中存储的地址,但可以修改指针指向的对象: char* const pstring(
  • 我们可以将指针声明为常量指针,这样指针是不可以改变的,但是指针指向的内容是可以改变。(指针中保存的地址是不可变的)。 #include using namespace std; class A  { public:  int get()const{...
  • 指针指向常量的指针指向常量的常指针
  • 今天想到C语言可以为一个...这样就定义了一个指针,该指针指向数组类型为short类型,切长度为1024,但是这个指针或者说是数组并没有初始化的地址, 于是需要给它初始化一下,也就是指定数组的起始地址,我是这样做的
  • 比如p为一个指针 p->num+=1; 怎么可以改变p->num; 上面的运算是想要达到的目的,但运行不成功,因为不可以只能赋值给一个左值,不能给表达式
  • const指针指向const的指针的区别

    千次阅读 2016-08-09 09:43:28
    一种指的是你不能修改指针本身的内容,另一种指的是你不能修改指针指向的内容。听起来有点混淆一会放个例子上来就明白了。  先说指向const的指针,它的意思是指针指向的内容是不能被修改的。它有两种写法。  const...
  • 一种指的是你不能修改指针本身的内容,另一种指的是你不能修改指针指向的内容。  先说指向const的指针,它的意思是指针指向的内容是不能被修改的。它有两种写法。  const int* p; (推荐)  int const* ...
  • 顺序栈栈顶指针指向详析

    千次阅读 2020-03-25 14:23:09
    顺序栈栈顶指针指向详析 1.变长型(动态分配内存空间) #define STACK_INIT_SIZE 100 //存储空间初始分配量 #define STACKINCREMENT 10 // 存储空间分配增量 typedef struct{ SElemType *top; //定义栈顶指针top ...
  • 指针,从字面的意思来理解,就是指针变量所指的空间地址是常量,既然是常量,那肯定不可以修改,即是只读变量。比如 #include&lt;iostream&gt; using namespace std; int main(){ i...
  • 1、尤其是指针参数,尽量使用assert宏做入口校验, assert函数功能及用法! assert(NULL != strDest); 2、典型的递归方式计算字符串长度 int my_strlen( const char* strDest ) {  assert(NULL != ...
  • 如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针指向地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是一致的。...
  • 修改const指针指向的值

    千次阅读 2014-11-21 15:33:43
    如果指向const的指针所指的对象并非const,则可直接给该对象赋值或间接地利用普通的非const指针修改其值,毕竟这个值不是const。 注:不能保证指向const的指针所指的对象的值一定不可修改。 在实际程序中,...
  • 就是一个函数的输入参数是一个指针,该函数需要改变该指针指向地址,如: 现在有一个全局数组b,现在需要编写一个函数 输入参数是一个指针a,需要通过该函数将该指针a指向数组b,即: int b[3] = {1,2,3}; void ...
  • 刚接触到指针时,关于指向...实际上,C++规定只能用指向常变量的指针指向常变量,普通指针指向它就会报错,原因也很容易理解,我们用普通指针指向常变量之后,有可能就会进行改变常变量数值的操作,这样做是不被允许
  • 1.指针到底能不能修改指向的常量字符串?今天做一个字符串右移函数时,直接使用指针修改字符串常量的值出现了奇怪运行时错误。  代码如下: #include"stdio.h" #include"string.h" void ...
  • 1.常量指针  全称:指向一个常量的指针,...可以更改该指针的值(更改指针指向地址)。  定义: const 在“*”左侧。const int *p int const *p   使用:1. int a = 5; const int b = 8; const int *c = &a; //合
  • 5、6、7、8是字面值常量,存放在代码区,是不能修改的,“abc”本身就是一个地址,然后你在栈区定义了四个指针都是指向同一个地址指针比较的时候比较的是指针存放的地址,而不是指针本身的地址,当然5、6、...
  • char *s = "sjdkjfl"; s[3] = 'd'; 上面的程序在编译的时候出现问题,而当改成下面数组样式的时候则通过了编译。...而指针p可以被修改指向其他地址,但如果试图修改字符串的内容是没有定义的。
  • c/c++向函数传递指针修改指向的问题

    千次阅读 多人点赞 2018-09-09 23:38:45
    而如果想要通过改变指针指向的方法来达到交换值的目的,一种想法是把swap函数修改为: void swap ( int *p1, int *p2) { int *p; p = p1; p1 = p2; p2 = p; } 方法看似很正确,但是很遗憾,执行完swap...
  • 1、在汉语中,定语一般都放在中心词的前面,像C语言和C++语言这种技术性语言,更是如此。 所以定语重要还是中心词重要,肯定是中心词重要。 ...指针常量:指针是定语,常量是中心词,所以指针常...
  • 指针地址修改

    千次阅读 2013-03-10 19:37:22
    char *GetMemory( char *p )  {  p=(char *)malloc(100);  return p;  }  传入GetMemory函数的形参为字符串指针,在函数内部修改不能真正改变传入形参的值... 其实是这样的,当你想修改指针指向的值的时候,那
  • 我是想把字符串内容修改为‘xx’,但是在只能修改形参的内容无法修改实参的内容,请问replaceSpace这个函数该如何修改才能在main函数调用后把它的字符串修改为‘xx’,谢谢。 ``` class Solution { public: void ...
  • 指向常量的指针和常量指针为一组说法,常量指针指针常量为一组说法。 一、pointer to a constant 叫法:有两种不同的叫法也就是第一组中的指向常量的指针,第二组中的常量指针。 形式: long value = 9999L; ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 434,078
精华内容 173,631
关键字:

修改指针指向的地址