如果我写这个
char *array = "One good thing about music";
Run Code Online (Sandbox Code Playgroud)
我实际创建一个数组?我的意思是这样的一样吗?
char array[] = {"One", "good", "thing", "about", "music"};
Run Code Online (Sandbox Code Playgroud) 这两行代码是否实现了相同的结果?如果我在函数中有这些行,那么在两种情况下字符串都存储在堆栈中吗?除了不需要在第一行代码中声明空终止符之外,我是否应该使用一个而不是另一个?
char s[] = "string";
char* s = "string\0";
Run Code Online (Sandbox Code Playgroud) 可能重复:
char*str ="STRING"和char str [] ="STRING"之间的区别?
C:指针和数组之间的差异
嗨,
谁能告诉我下面的陈述之间的区别?
char *p = "This is a test";
char a[] = "This is a test";
Run Code Online (Sandbox Code Playgroud) 可能的重复:
C:指针和数组之间的
差异结果的大小不同
基本上,我这样做了......
char *str1 = "Sanjeev";
char str2[] = "Sanjeev";
printf("%d %d\n",strlen(str1),sizeof(str1));
printf("%d %d\n",strlen(str2),sizeof(str2));
Run Code Online (Sandbox Code Playgroud)
我的输出是
7 4
7 8
Run Code Online (Sandbox Code Playgroud)
我无法说明原因为sizeof str14.请解释这些之间的区别.
char *ch = "delhi"; // valid
int *arr = {1, 2, 3}; // invalid
int *arr = (int[3]){1, 2, 3}; // valid
Run Code Online (Sandbox Code Playgroud)
为什么上述某些陈述有效而其他陈述无效?
请考虑以下代码.
int main(void) {
char * test = "abcdefghijklmnopqrstuvwxyz";
test[5] = 'x';
printf("%s\n", test);
return EXIT_SUCCESS;
}
在我看来,这应该打印abcdexghij.但是,它只是终止而不打印任何东西.
int main(void) {
char * test = "abcdefghijklmnopqrstuvwxyz";
printf("%s\n", test);
return EXIT_SUCCESS;
}
然而,这工作得很好,所以我误解了操纵C字符串或其他东西的概念吗?如果它很重要,我正在运行Mac OS X 10.6,它是我正在编译的32位二进制文件.
我有以下代码.
char a[] = "abcde";
char *b = "fghij";
char *c = malloc(6);
char *d = c;
c = "klmno";
Run Code Online (Sandbox Code Playgroud)
演习陈述:
绘制数据结构a,b,c和d(带内容)的图片,您可以在其中查看已分配的内容并使用箭头显示指针的设置方式.
我的解决方案是:
____________
a -> |a|b|c|d|e|\0|
¨¨¨¨¨¨¨¨¨¨¨¨
____________
b -> |f|g|h|i|j|\0|
¨¨¨¨¨¨¨¨¨¨¨¨
____________
c -> |k|l|m|n|o|\0|
¨¨¨¨¨¨¨¨¨¨¨¨
___________
d -> | | | | | | |
¨¨¨¨¨¨¨¨¨¨¨
Run Code Online (Sandbox Code Playgroud)
但是我的解决方案没有被接受,响应是" 为指向b,c,d而不是a的指针分配内存 ".有人能解释一下这意味着什么吗?
我在遗留项目中看到了以下代码段.
/* token.c */
struct token id_tokens[MAX_TOKENS];
/* analyse.c (v1) */
extern struct token *id_tokens; /* Raised my eyebrow, id_token declares a pointer */
Run Code Online (Sandbox Code Playgroud)
我坚持要改变analyse.c以包含如下声明:
/* analyse.c (v2) */
extern struct token id_tokens[]; /* I am happy with this. id_tokens declares array of unspecified size. */
Run Code Online (Sandbox Code Playgroud)
我想v2因为pointer to T不一样array of T.我朋友的反驳说,两者的行为都是一样的,所以我使用v1和v2并不重要.
问题1:不完整类型的数组是否耗尽指针?
问题2:我的朋友是对的,两个版本在行为上都保证是等价的吗?
所以我看到了一些关于如何找到架构的字节顺序的例子.假设我们有一个指向int数据类型的整数指针.让我们说int值是0x010A0B12.在小端架构中,最低有效字节(即12)将存储在最低内存地址中,对吧?因此,4字节整数中的最低字节为12.
现在,检查.如果我们声明了一个char指针p,并且将整数指针强制转换为char*并将其存储在p中,并打印出取消引用的p值,我们将获得该架构的字节序的线索.如果它是12,我们就是小尾数; 01表示大端.听起来真的很整洁......
int a = 0x010A0B12;
int *i = &a;
char *p = (char*)i;
printf("%d",*p); // prints the decimal equivalent of 12h!
Run Code Online (Sandbox Code Playgroud)
这里有几个问题,真的.由于指针是强类型的,字符指针不应该严格指向char数据类型吗?用%d打印的是什么?难道我们不应该用%c打印字符吗?
所以我最近一直在玩C,并且一直试图理解通过值/引用传递的复杂性以及在函数内操作传入变量的能力.然而,我遇到了以下问题:
void modifyCharArray(char *input)
{
//change input[0] to 'D'
input[0] = 'D';
}
int main()
{
char *test = "Bad";
modifyCharArray(test);
printf("Bad --> %s\n", test);
}
Run Code Online (Sandbox Code Playgroud)
所以想法只是修改函数内的char数组,然后在修改完成后打印出所有数组.但是,这会失败,因为我所做的只是修改input传入的值,而不是实际的内存地址.
简而言之,有没有什么方法可以让我char *input进入一个函数并修改它的原始内存地址而不使用像memcpystring.h 这样的东西?