相关疑难解决方法(0)

将数组和数组指针传递给C中的函数之间的区别

C中两个函数有什么区别?

void f1(double a[]) {
   //...
}

void f2(double *a) {
   //...
}
Run Code Online (Sandbox Code Playgroud)

如果我要在一个相当长的数组上调用这些函数,这两个函数的行为会不同,它们会占用更多的空间吗?

c arrays function parameter-passing space-efficiency

104
推荐指数
2
解决办法
7万
查看次数

何时使用const char*以及何时使用const char []

我知道他们是不同的,我知道他们是如何不同的,我读了所有关于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 c++

43
推荐指数
3
解决办法
5万
查看次数

是在静态内存中创建的c ++中的字符串文字吗?

c ++中的字符串文字是在静态内存中创建的,只有在程序退出时才会被销毁?

c++ string char

42
推荐指数
2
解决办法
2万
查看次数

C/C++ int [] vs int*(指针与数组表示法).有什么不同?

我知道C中的数组只是指向顺序存储数据的指针.但是,差异意味着符号[]和*的区别.我的意思是在所有可能的使用环境中 例如:

char c[] = "test";
Run Code Online (Sandbox Code Playgroud)

如果在函数体中提供此指令,它将在堆栈上分配字符串

char* c = "test";
Run Code Online (Sandbox Code Playgroud)

将指向数据(只读)段.

您是否可以在所有使用情境中列出这两种表示法之间的所有差异,以形成清晰的一般视图.

c c++ arrays standards pointers

37
推荐指数
2
解决办法
4万
查看次数

编译器用a [i]做什么?a是数组?如果a是指针怎么办?

c-faq告诉我,编译器在处理a [i]时做了不同的事情,而a是数组或指针.这是c-faq的一个例子:

char a[] = "hello";
char *p = "world";
Run Code Online (Sandbox Code Playgroud)

鉴于上面的声明,当编译器看到表达式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)

c c++ arrays assembly pointers

14
推荐指数
1
解决办法
943
查看次数

为什么对于具有指定长度的数组,C中的字符串赋值是不可能的?

可能重复:
C中的char s []和char*s有什么区别?
关于指针的这些陈述是否具有相同的效果?

这段时间我一直认为每当我需要复制一个字符串(文字或变量)时我都需要使用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)

如果有人能稍微清理一下,我会很高兴.

c string initialization literals

5
推荐指数
2
解决办法
5427
查看次数

这个程序有什么问题?

我正在尝试编写字符串连接代码.我想知道它有什么问题.你能不能帮帮我吧 这是我的代码.

#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"是否会产生任何差异?

c string

2
推荐指数
1
解决办法
135
查看次数

char*p ="orkut"vs const char*p ="orkut"

 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 pointers

1
推荐指数
1
解决办法
495
查看次数

恼人的C++ gcc警告信息

我编写了以下程序来匹配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)

c++

-3
推荐指数
1
解决办法
285
查看次数