我很困惑为什么我可以通过使用char *创建一个字符串。不是char *只是指向单个char的指针吗?是什么让我突然被允许把这件事当作一个字符串?我可以用其他物品做到这一点吗?怎么样:
int* arr;
我现在有一系列的整数?它是动态大小的吗?我可以开始致电
吗?arr[0] and arr[1]
并期望它起作用?
我现在谷歌搜索了很长一段时间,并且无法找到这个问题的任何明确答案。 这是C I的一部分,它总是被接受为它的工作方式......不再是。
答案 0 :(得分:2)
指针指向事物。 int *arr;
目前不指向任何地方。您不能将其视为指向任何内容(数组或其他)。
你可以指出什么。如果将其指向单个int,则可以将其视为指向单个int。如果将其指向int数组的元素,则可以将其视为指向数组的元素。
在这方面, char
与int
(或任何其他对象类型)的行为相同。如果您首先将char *
指向字符串,则只能将char *
视为指向字符串。
答案 1 :(得分:1)
不是char *只是指向单个char的指针吗?
它是一个指向应该保存char的内存位置的指针。它可以是单个已分配的char,也可以是多个char的数组。
是什么让我突然被允许将这件事当作一个字符串来对待?
当char *指针指向一个接一个(数组)分配了几个chars []的内存位置时,您可以使用数组索引[idx]访问它们。但你必须要么:
一个。在代码中使用静态分配的数组:
char myArray[5];
B中。或动态分配(C语言中的malloc()):
int chars_in_my_array = 10;
char* myArray = (char*)malloc( sizeof(char) * chars_in_my_array );
我可以和其他物品一起使用吗?怎么样:int * arr;我现在有一系列的整数?
不,你没有:
int* p; //'p' is a *pointer* to an int
int arr[10]; //'arr' is an array of 10 integers in memory.
您可以通过执行以下操作将'p'设置为指向'arr'中的第一个元素:
p = &arr[0]; //'p' points to the address of the first item in arr[]
是动态大小吗?
没有。这是你在C ++中的'std :: string'或Java中的'String'等高级构造中看到的东西。在C中,手动管理内存(或者使用现有的库函数为您执行此操作。请参阅标准头文件'string.h')
我可以开始调用arr [0]和arr [1]并期望它能够正常工作吗?
除非你这样做:
int arr[5];
arr[0] = 100; arr[1] = 200;
...因为你静态地分配了一个包含五个整数的数组。然后你可以使用数组下标来访问它们。
但是你不能这样做:
int* p;
p[0] = 100; p[1] = 200; // NO!!
因为'p'只是一个包含整数存储器地址的变量。除非为它明确分配内存,否则它实际上不会分配任何内存。你可以这样做:
int* p;
int arr[10];
p = &arr[0];
p[0] = 100; p[1] = 200; // This is OK
这是有效的,因为'p'现在指向已经(静态)为数组分配的内存。所以我们可以通过指针'p'来访问数组。
您还可以动态分配数组:
int* p;
p = (int*)malloc( sizeof(int) * 10 );
if( p != NULL ) {
p[0] = 100;
p[1] = 200;
}
这里我们为10个整数分配内存,为第一个项目分配'p'分。现在我们可以使用'p'作为数组。但最多仅限10件物品!
我现在谷歌搜索已经有一段时间了,找不到任何明确的 回答这个问题。这是C的一部分我一直都是 接受它的工作方式......不再。
真的?尝试谷歌搜索'c'中的'数组','C中的内存分配','静态与动态分配C',以及malloc()和free()等函数。有太多可用的信息,但希望这对初学者有帮助:))