如何使用int指针访问char数组?

时间:2015-11-23 04:26:28

标签: c

如何使用整数点访问字符数组。

char arr[10] = {'1','2','3','4','5','6','7','8','9','10'};
int *ptr;

如何使用指针ptr打印'arr'的值?

4 个答案:

答案 0 :(得分:2)

目前还不清楚你的目标是什么,但尝试使用整数指针打印出一个字符数组有点像尝试一次采取四个步骤进入第二步。当您告诉编译器您想要使用整数指针引用内存地址时,编译器知道整数是sizeof (int)个字节(通常是x86 / x86_64上的4个字节)。因此,尝试使用整数指针和普通指针算法访问字符数组中的每个元素都不会起作用。 (你将一次推进4个字节)。

但是,如果使用整数指针作为数组的起始地址,并通过转换回{{1}将指针推进数组中的字符数,则可以通过integer指针打印字符数组。 }}。虽然这是你的目标值得怀疑,但你的问题的简单陈述似乎暗示了这一点。要做到这一点,你可以:

char

<强>输出

#include <stdio.h>

int main (void)
{
    char arr[] = {'1','2','3','4','5','6','7','8','9'};
    int *ptr = (int *)arr;
    unsigned int i;

    for (i = 0; i < sizeof arr; i++)
        printf (" %c", (*(char *)ptr + i));
    putchar ('\n');

    return 0;
}

注意:您使用字符$ ./bin/char_array_int_ptr 1 2 3 4 5 6 7 8 9 的数组的原始初始化无效。如果这是一个赋值,它可能会让你了解指针算法如何受类型的影响,以及从{和{}}类型转换的能力(不违反严格的别名规则)< / p>

答案 1 :(得分:1)

如果您刚好在整数值之后,则可以将字符打印为整数

for (i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i)
{
  printf( "%d ", arr[i] );
}

答案 2 :(得分:1)

使用错误数据类型的指针访问任何内容是未定义的行为,因此不是您想要做的事情。如果要将char转换为整数,则可以执行此操作。如果要打印char的整数值,也可以这样做。

但是使用指针类型整数来访问char数组是未定义的行为。

答案 3 :(得分:-3)

只需将数组名称指定给指针(使用某些转换):

int* ptr = (int*)arr;

数组变量实际上只是指向数组第一个元素的指针,所以这段代码相当于:

int* ptr = (int*)&arr[0];

正如本评论中所提到的,你可以让自己陷入一些令人讨厌的麻烦。在大多数现代32位系统中,int的宽度是char的4倍,因此递增ptr将跳过arr中的4个元素,您将得到4个当您取消引用int时,字符被解释为单个ptr。如果您不是非常小心,这将导致段错误和/或未定义的行为。事实上,即使你小心,你也可能会得到未定义的行为。

那就是说,这几乎肯定不是你想做的。听起来你想要将arr中的值解释为整数。要做到这一点,首先要了解C和C ++中的charint没有任何区别(除了它们的内存大小和它们可以表示的值范围)。 '0'相当于48(字符0的ASCII序号)。因此,要将单个数字解释为整数,请执行以下操作:

int x = arr[i]-'0';

其中i是您要访问的数组中的索引。如果要将多位数字符串解释为整数,atoi是作业的工具:

#include <stdlib.h>
#include <stdio.h>
int main() {
  char* s = "12345";
  int x = atoi(s);
  printf("%d\n", x); // 12345
  return 0;
}