跃I.0
2018-08-23 09:51
采纳率: 52.2%
浏览 3.0k
已采纳

能不能通过修改指针的指向来修改指针所指向的变量的值

这里主要是指的是字符串指针
比如

 比如 char s1[]="hello"; s=s1; char *t="www",我想让s内容变成"hellowww" 可以通过直接使用指针指向来做么,不要string.h函数 不要循环赋值。就是想通过修改指针指向来做

这个可以实现么 不要函数不要循环复制 为什么不能让s+5=t,就是让它接下来指向t的地址呢

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

6条回答 默认 最新

  • 吃苹果的毛毛虫 2018-09-11 15:00
    已采纳

    如果s1和t这两个字符串在内存连续的话,那么s=s1,s+6==t是真,C的字符串需要额外的计算一个字符串结束符\0

    如果你的问题是是不是能够修改指针的值来修改指针指向的数据,这个是可以的,并且在C中也很常见,前提就是你得准确的知道你的源地址和目标地址的偏移,以及目标地址存储的数据类型,这样才能正确的提取出你要的数据

    比较经典的例子是linux kernel list.h中的宏

     #define container_of(ptr, type, member) ({ \
    
        const typeof(((type *)0)->member ) *__mptr = (ptr); \
    
        (type *)((char *)__mptr - ((size_t) &((type *)0)->member));})
    
    打赏 评论
  • underthesun2008 2018-08-23 10:37

    你这个s1和t指向的地址并不是相邻的

    打赏 评论
  • black_kyatu 2018-08-23 13:46

    s+5 = t 是会报错的,因为s+5 不是一个可以被赋值的左值表达式,找不到赋值对象,没有意义。
    假定你的s是一个字符指针,那么s+5是一个地址,可以看做是一个暂时的常量。所以你无法通过赋值改变s+5 的值使其变为t指向的地址。

    同时,你如果直接通过循环赋值,即

     for( int  i = 0; i < 3; i++)
         *( s + 5 + i ) = *( t + i );
    

    是可以实现直接在s的后面接上t的内容,但这么做同样有风险,
    因为你不能保证s指向的字符串后面的几个字节是空的,
    也就是说这么做的同时你覆盖掉了s1后面3个字节的内容,导致数据丢失
    严重的话可能会报错。

    其实简单的话你直接使用string类来做,C++的string库里重载了+运算,可以直接实现字符串连接

     #include <iostream>
    #include <string>
    using namespace std;
    
    string s1 = "hello";
    string t = "www";
    
    int main()
    {
        s1 += t;
        cout << s1;
    }
    
    打赏 评论
  • AlphaGo_Zero 2018-08-23 13:48

    首先,s+5是右值,所以

     s+5=t
    

    连编译都无法通过

    其次,s只是一个指向字符串的指针,所以这样肯定不行。

    建议用c++(如果你坚持用c的话那只能用memcpy了)的string类

    打赏 评论
  • 化屾为海 2018-08-24 07:27

    首先说明赋值运算在C和C++中变量才可以赋值,S+5 = t;这是语法错误;等号左边运算后是一个常量,常量是不允许赋值的。C语言中要使S ="hellowww", 需要定义S为一个字符数组然后把s1[]="hello"和char * t="www" 截取存储在S数组中。通过指针改变去访问S1和t是达不到S = “hellowww”效果。在C++中使用字符串连接函数实现字符串拼接,其实也是做的字符拷贝,将t和S1的字符拷贝在S的内存单元从而实现的S地址域是hellowww的字符串,谨记S+5= t是错误语法。

    打赏 评论
  • Panstar_ 2018-09-12 20:57

    除非内存连续,否则无法做到。
    s是"hello"这段内容的首地址,而t是"www"这段内容的首地址,如果地址不连续这两段内容是不能通过指针拼接在一起的。
    可以使用strcat()或者sprintf将字符串拼接,你这样直接操作指针容易出错也没有必要

    打赏 评论

相关推荐 更多相似问题