学习C指针 - 分配是打印出三个不同数组的地址和变量大小

时间:2014-09-24 21:12:09

标签: c arrays pointers

我写了下面的代码,它可以工作,我可以看到一个指针只占用(我认为)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;
}

感谢您的协助!!

5 个答案:

答案 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 *的地方之一。