我写了下面的代码,它可以工作,我可以看到一个指针只占用(我认为)4个字节的内存;而一个普通的旧数组占用20个字节。但是,我不确定它为什么会起作用!
当我声明我的字符数组时,我必须使它成为指针,否则它将无法编译和运行。然后我能够使我的角色成为一个int型指针;但我不确定为什么会这样。
为什么我可以这样做“int * ptrOfChars = arrayOfChars;”而不是这样做“char * ptrOfChars = arrayOfChars;” ?
这是我的代码:
int main(void)
{
int i;
int arrayOfNums[] = {1,2,3,4,5};
char *arrayOfChars[] = {"hello","how","are","you","doing"};
float arrayOfFloats[] = {1.23,2.34,3.45,4.56,5.67};
int *ptrOfNums = arrayOfNums;
int *ptrOfChars = arrayOfChars;
float *ptrOfFloats = arrayOfFloats;
printf("\n\n");
printf("----- Array of Numbers -----\n");
printf("The size of this array is %d\n\n", sizeof(arrayOfNums));
for (i = 0; i < 5; i++)
{
printf("Value in the array is %d\n", *ptrOfNums);
printf("Address of pointer is %x\n", ptrOfNums++);
}
printf("\n\n");
printf("----- Array of Characters -----\n");
printf("The size of this array is %d\n\n", sizeof(*arrayOfChars));
for (i = 0; i < 5; i++)
{
printf("Value in the array is %s\n", *ptrOfChars);
printf("Address of pointer is %x\n", ptrOfChars++);
}
printf("\n\n");
printf("----- Mardi Gras -----\n");
printf("The size of this array is %d\n\n", sizeof(arrayOfFloats));
for (i = 0; i < 5; i++)
{
printf("Value in the array is %f\n", *ptrOfFloats);
printf("Address of pointer is %x\n", ptrOfFloats++);
}
system("pause");
return 0;
}
感谢您的协助!!
答案 0 :(得分:2)
//This is an array of strings.
char *arrayOfChars[]={"hello","how","are","you","doing"};
//This is an array of characters.
char arrayOfChars[]={'h','e','l','l','o',};
数组char *arrayOfChars[]
中的每个指针指向每个单词的第一个字符
这是从阵列中查找单词所需的所有信息
例如,要获得数组的第一个单词,您需要一个指向字符串的第一个字符的指针&#39; hello&#39;。
然后你会找到下一个角色和下一个角色等等
h - &gt; e - &gt; l - &gt; l - &gt; o - &gt; EndOfString。
答案 1 :(得分:0)
声明一个指针数组,该数组是(char *)类型。
char *arrayOfChars[] = {"hello","how","are","you","doing"};
这意味着你有:
arrayOfChars[0] -> "hello"
arrayOfChars[1] -> "how"
arrayOfChars[2] -> "are"
arrayOfChars[3] -> "you"
arrayOfChars[4] -> "doing"
sizeof(arrayOfChars [0])是4(4个字节,这是char *变量的大小),strlen(arrayOfChars [0])是5(字符串“hello”的长度)。希望它有所帮助。
答案 2 :(得分:0)
这是因为当你打印arrayOfChars的值时,它是一个整数(arrayOfChars [0]的地址,即&#34; Hello&#34;)。 并且你的ptrOfChars指向这个整数。
答案 3 :(得分:0)
arrayOfChars
不是一个字符数组,而是一个指向字符串的指针数组。因此,ptrOfChars
的正确定义应为:
char **ptrOfChars = arrayOfChars;
将arrayOfChars
分配给int *ptrOfChars
是有效的,因为在这种情况下,指针和int的大小都是4个字节,因此大小相同。此外,因为C并没有真正进行任何强类型检查,所以将int的值作为char指针的值传递仍然可以正常工作。但是,在不同的内存模型(如64位)下,指针和int的大小可能不同,因此您的代码不能与int *ptrOfChars
一起使用。
要打印数组arrayOfChars
的大小,您需要使用sizeof(arrayOfChars)
代替sizeof(*arrayOfChars)
。
最后,1.23,2.34等值的类型为double
而不是float
。要拥有float
,你应该在最后添加一点f:1.23f,2.34f等。
答案 4 :(得分:0)
为什么我可以这样做&#34; int * ptrOfChars = arrayOfChars;&#34;而不是这样做&#34; char * ptrOfChars = arrayOfChars;&#34; ?
因为表达式的类型 arrayOfChars
&#34;衰变&#34;输入char **
,而不是char *
。
除非它是sizeof
或一元&
运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,表达式为类型&#34; T
&#34;的N元素数组;将被转换(&#34;衰减&#34;)到类型为#34的表达式;指向T
&#34;的指针,并且表达式的值是数组的第一个元素的地址
所以,鉴于声明:
char *arrayOfChars[] = {"hello","how","are","you","doing"};
表达式 arrayOfChars
具有类型&#34; 5元素数组char *
&#34; (每个字符串文字也是一个数组表达式,并且还受上面提到的转换规则的约束)。如果arrayOfChars
出现在不 sizeof
或一元*
运算符的操作数的表达式中,它将转换为&#type的表达式34;指向char *
&#34;或char **
的指针。
我原本希望编译器抱怨用int *
表达式初始化char **
。
最后,使用%p
转换说明符打印出指针值:
printf( "address of arrayOfChars = %p\n", (void *) arrayOfChars );
这是少数需要明确转换为void *
的地方之一。