这里主要是指的是字符串指针
比如
比如 char s1[]="hello"; s=s1; char *t="www",我想让s内容变成"hellowww" 可以通过直接使用指针指向来做么,不要string.h函数 不要循环赋值。就是想通过修改指针指向来做
这个可以实现么 不要函数不要循环复制 为什么不能让s+5=t,就是让它接下来指向t的地址呢
如果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));})
你这个s1和t指向的地址并不是相邻的
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;
}
首先,s+5是右值,所以
s+5=t
连编译都无法通过
其次,s只是一个指向字符串的指针,所以这样肯定不行。
建议用c++(如果你坚持用c的话那只能用memcpy了)的string类
首先说明赋值运算在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是错误语法。
除非内存连续,否则无法做到。
s是"hello"这段内容的首地址,而t是"www"这段内容的首地址,如果地址不连续这两段内容是不能通过指针拼接在一起的。
可以使用strcat()或者sprintf将字符串拼接,你这样直接操作指针容易出错也没有必要