繁体   English   中英

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

[英]How to access char array using an int pointer?

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

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

我如何使用指针 ptr 打印“arr”的值?

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

但是,如果将整数指针用作数组的起始地址,并通过回退到char来使指针按数组中的字符数前进,则可以通过integer指针打印字符数组。 尽管这是您的目标值得怀疑,但您的问题的明确表述似乎表明了这一点。 为此,您可以:

#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

注意:最初使用字符'10'对数组进行的初始化无效。 如果这是一项任务,则可能会使您了解指针算术如何受类型影响以及从char和从类型char的能力(不违反严格的别名规则)

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

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

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

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

只需将数组名称分配给指针(使用一些强制转换):

int* ptr = (int*)arr;

数组变量实际上只是指向数组第一个元素的指针,因此此代码等效于:

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

正如在此评论中提到的那样,这样做会使您陷入麻烦。 在大多数现代的32位系统上, int宽度是char 4倍,因此递增ptr将使arr 4个元素向前跳转,并且当取消引用ptr时,您将获得4个char解释为单个int 如果您不太谨慎,这将导致段错误和/或不确定的行为。 实际上,即使您小心一点,也可能会得到不确定的行为。

也就是说,这几乎可以肯定不是您想要做的。 听起来您想将arr的值解释为整数。 为此,您首先必须了解C和C ++中的char实际上与int并无任何区别(除了它们的内存大小和它们可以表示的值范围外)。 '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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM