为什么char *会创建一个字符串?

时间:2016-03-27 04:43:37

标签: c arrays pointers

我很困惑为什么我可以通过使用char *创建一个字符串。不是char *只是指向单个char的指针吗?是什么让我突然被允许把这件事当作一个字符串?我可以用其他物品做到这一点吗?怎么样:

int* arr;

我现在有一系列的整数?它是动态大小的吗?我可以开始致电

吗?
arr[0] and arr[1]

并期望它起作用?

我现在谷歌搜索了很长一段时间,并且无法找到这个问题的任何明确答案。 这是C I的一部分,它总是被接受为它的工作方式......不再是。

2 个答案:

答案 0 :(得分:2)

指针指向事物。 int *arr;目前不指向任何地方。您不能将其视为指向任何内容(数组或其他)。

你可以指出什么。如果将其指向单个int,则可以将其视为指向单个int。如果将其指向int数组的元素,则可以将其视为指向数组的元素。

在这方面,

charint(或任何其他对象类型)的行为相同。如果您首先将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()等函数。有太多可用的信息,但希望这对初学者有帮助:))