C中两个函数有什么区别?
void f1(double a[]) {
//...
}
void f2(double *a) {
//...
}
Run Code Online (Sandbox Code Playgroud)
如果我要在一个相当长的数组上调用这些函数,这两个函数的行为会不同,它们会占用更多的空间吗?
我知道他们是不同的,我知道他们是如何不同的,我读了所有关于char*vs的问题char[]
但所有这些答案都没有告诉他们何时应该使用它们.
所以我的问题是:
你什么时候用的
const char *text = "text";
Run Code Online (Sandbox Code Playgroud)
你什么时候用的
const char text[] = "text";
Run Code Online (Sandbox Code Playgroud)
有没有指导方针或规则?
举个例子,哪一个更好:
void withPointer()
{
const char *sz = "hello";
std::cout << sz << std::endl;
}
void withArray()
{
const char sz[] = "hello";
std::cout << sz << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
(我知道std::string也是一个选项,但我特别想了解char指针/数组)
我知道C中的数组只是指向顺序存储数据的指针.但是,差异意味着符号[]和*的区别.我的意思是在所有可能的使用环境中 例如:
char c[] = "test";
Run Code Online (Sandbox Code Playgroud)
如果在函数体中提供此指令,它将在堆栈上分配字符串
char* c = "test";
Run Code Online (Sandbox Code Playgroud)
将指向数据(只读)段.
您是否可以在所有使用情境中列出这两种表示法之间的所有差异,以形成清晰的一般视图.
c-faq告诉我,编译器在处理a [i]时做了不同的事情,而a是数组或指针.这是c-faq的一个例子:
Run Code Online (Sandbox Code Playgroud)char a[] = "hello"; char *p = "world";鉴于上面的声明,当编译器看到表达式a [3]时,它会发出代码从位置"a"开始,移动三个,然后在那里获取字符.当它看到表达式p [3]时,它会发出代码从"p"位置开始,在那里获取指针值,向指针添加三个,最后获取指向的字符.
但有人告诉我,在处理[i]时,编译器倾向于将a(这是一个数组)转换为指向数组的指针.所以我想查看汇编代码以找出哪个是正确的.
编辑:
这是本声明的来源.c-faq 并注意这句话:
形式a [i]的表达式导致数组衰减成指针,遵循上面的规则,然后被下标,就像表达式p [i]中的指针变量一样(尽管最终的内存访问将是不同,"
我对此很困惑:既然a已经衰减到指针,那为什么他的意思是"内存访问会有所不同?"
这是我的代码:
// array.cpp
#include <cstdio>
using namespace std;
int main()
{
char a[6] = "hello";
char *p = "world";
printf("%c\n", a[3]);
printf("%c\n", p[3]);
}
Run Code Online (Sandbox Code Playgroud)
这是我使用g ++ -S array.cpp获得的汇编代码的一部分
.file "array.cpp"
.section .rodata
.LC0:
.string "world"
.LC1:
.string "%c\n"
.text
.globl main
.type main, @function
main:
.LFB2:
leal 4(%esp), %ecx
.LCFI0:
andl $-16, %esp
pushl -4(%ecx)
.LCFI1:
pushl …Run Code Online (Sandbox Code Playgroud) 这段时间我一直认为每当我需要复制一个字符串(文字或变量)时我都需要使用strcpy().但是我最近发现了这个:
char a[]="test";
Run Code Online (Sandbox Code Playgroud)
还有这个
char *a="test";
Run Code Online (Sandbox Code Playgroud)
根据我的理解,第二种类型是不安全的,并且在某些情况下会打印垃圾.那是对的吗?是什么让我更加好奇是为什么以下不起作用:
char a[5];
a="test";
Run Code Online (Sandbox Code Playgroud)
或这个
char a[];
a="test";
Run Code Online (Sandbox Code Playgroud)
但这有效
char *a;
a="test";
Run Code Online (Sandbox Code Playgroud)
如果有人能稍微清理一下,我会很高兴.
我正在尝试编写字符串连接代码.我想知道它有什么问题.你能不能帮帮我吧 这是我的代码.
#include <stdlib.h>
void strcat1(char *s, char *t)
{
while(*s !='\0')
s++;
while((*s++=*t++)!= '\0')
{
}
}
int main()
{
char s[]= "hello";
char t[]= "world";
strcat1(s,t);
printf("%s", s);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在codepad.org上得到了这个输出:Disallowed system call: SYS_socketcal
这是链接:http://codepad.org/Arz6U7YA
编辑:主函数中的更改char*s ="Hello"和char*t ="World"是否会产生任何差异?
char *p="orkut" vs const char *p="orkut"
Run Code Online (Sandbox Code Playgroud)
什么是这两个差异...
编辑
来自bjarne stroustrup,第3版第90页
void f()
{
char* p="plato";
p[4]='e' // error: assign to const;result is undefined
}
Run Code Online (Sandbox Code Playgroud)
这种错误通常不会被捕获,直到运行时间和实施在执行此规则方面有所不同
与const char*p ="plato"相同
这就是为什么我会问这种差异...... 这里的const的意义是什么?
我编写了以下程序来匹配C++中的正则表达式
#include <regex.h>
#include <iostream>
using namespace std;
/*
* Match string against the extended regular expression in
* pattern, treating errors as no match.
*
* return true for match, false for no match
*/
bool match(const char *string, char *pattern)
{
int status; regex_t re;
if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB) != 0)
return false;
/* report error */
status = regexec(&re, string, (size_t) 0, NULL, 0);
regfree(&re);
if (status != 0) {
return false; /* report error */
} …Run Code Online (Sandbox Code Playgroud)