字符串文字如何等于char*,如何将字符串作为参数

字符串文字如何等于char*,如何将字符串作为参数,c,string,pointers,C,String,Pointers,我在几段代码中看到了一个声明为char*的字符串。这是如何工作的,当然是指向单个字符的指针,而不是组成字符串的字符数组。如果我希望将字符串输入到如下调用的方法: theMethod("This is a string literal"); 参数应该是什么数据类型 当然,它是指向单个字符的指针,而不是字符数组 它是指向char数组的第一个字符的指针。通过执行指针算术和“数组”索引,可以使用指向其第一个元素的指针访问数组的每个元素 参数应该是什么数据类型 const char*,如果您不想修改函数

我在几段代码中看到了一个声明为char*的字符串。这是如何工作的,当然是指向单个字符的指针,而不是组成字符串的字符数组。如果我希望将字符串输入到如下调用的方法:

theMethod("This is a string literal");
参数应该是什么数据类型

当然,它是指向单个字符的指针,而不是字符数组

它是指向
char
数组的第一个字符的指针。通过执行指针算术和“数组”索引,可以使用指向其第一个元素的指针访问数组的每个元素

参数应该是什么数据类型


const char*
,如果您不想修改函数中的字符(这是一般情况),如果您想修改,则为
char*

这是初学者常见的C混淆。指向任何类型(
T*
)的指针都是指向类型T的单个对象的指针,或者是指向类型T的线性对象数组中的元素的指针(未指定大小)。作为程序员,您有责任知道哪个是哪个,并根据需要传递长度信息。如果你弄错了,编译器会袖手旁观,看着你的程序驶离未定义的行为悬崖

在某种程度上,C有字符串(有一个很强的例子表明它不是真的),它们无耻地利用了这种模糊性,因此当你在C程序中看到
char*
const char*
时,它几乎总是一个指向字符串的指针,而不是一个
char
。指向任何其他类型的指针也不一样。

每个定义都是char*(或unsigned char*或const char*)类型的“string”,但它是指向该字符链的第一个字符的指针(我不想使用单词数组或向量)。区别在于字符中的“x”(单引号)

这是很好的旧c编程(有时我会为失去它而哭泣)


我在这里没有使用const和其他问题,我只是尝试清除

char*如果您将字符串存储在数组中,这项工作将完成函数将字符串传递给SDL_WM_SetCaption(const char*,const char*)当我自己尝试使用char*时,SDL窗口中显示的标题是一堆废话。(这个问题可能与SDL有关,但可能出了什么问题)@handuel不幸的是,这还不够。您应该显示一些实际的代码。“我试着服用了char”是没有信息的,这很公平。我想我会接受这个答案,并针对这个问题开始一个单独的问题,因为它很难用600个字符来表达。我已经解决了这个问题,这只是一个愚蠢的错误,但是我得到了以下编译器警告:main.cpp:10:41:警告:不推荐将字符串常量转换为“char*”[-Wwrite strites strings]当我调用以char*作为参数的函数时。这可以吗?我应该试着修复它吗?@handuel编译器是正确的(在你成为初学者之前,编译器总是正确的),你应该总是修复每个警告。此警告告诉您应该将字符串文字视为
常量字符数组
,因为您无法修改其内容<代码>字符*foo=“bar”错误,
const char*foo=“bar”
很好,正如我刚才解释的,如果要修改其参数,函数应该采用
char*
。如果不这样做,则应该使用
constchar*
。在本例中,您正在修改一个字符串常量。由于历史原因,字符串常量的类型为(char*),但编译器允许将它们放在只读内存中(现在通常是这样),并且不允许修改它们。@ElchononEdelson:当然!你是对的,我只是想指出什么是“字符串”和字符*,我认为这对于学习C语言的人来说是个好问题。
char *p = "i am here";
for (q=p; ++q; *q) { // so lets start with p walk through and end wit the /0 after the last e 
    if (*q=='h') { // lets find the first 'h' and cut the string there
        *(q-1)=0;
        break;
    }
}