c语言关于打印指针所指的值的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言关于打印指针所指的值的问题相关的知识,希望对你有一定的参考价值。

#include<stdio.h>
#include<string.h>
int main()
char *a[]="abc","def","ghi";
char *b=&a[0];
printf("%s",*b);
return 0;

请问这段代码有什么问题?它打印的是null而不是abc

只有一个问题,把printf("%s",*b);这一句中的“*”去掉,改成:
printf("%s",b);
就能打印“abc”了。
有什么问题请留言。
参考技术A *a[] 对应的是二维数组,a+i 的内容就是第 i 个字符串的首地址

printf("%s",*(a+i)) 输出第i个字符串
printf("%c",*(a[i]+j))输出第i个字符串的第j个字符
char *b 对应的是一维数组,b = a+i
printf("%c",b) 只能输出第i个字符串的首字母
参考技术B #include #include int main() char *a[]="abc","def","ghi"; char *b=&a[0]; printf("%s",*b); return 0;
最后的printf有问题 %s要的是地址 *b是字符a的值
参考技术C 有两种改法:
1、
char *b=a[0];
printf("%s",b);
2、
char **b=&a[0];
参考技术D

C - 指向随机值的指针

【中文标题】C - 指向随机值的指针【英文标题】:C - Pointer points to random values 【发布时间】:2017-08-20 11:08:33 【问题描述】:

总的来说,我对指针感到很困惑,我不知道为什么会发生这种情况。通常,指向数组的指针只会打印出数组的值,但我不知道为什么会这样。有人可以解释原因或建议正在发生的事情吗?

char *showBits(int dec, char *buf) 
    char array[33];
    buf=array;
    unsigned int mask=1u<<31;
    int count=0;
    while (mask>0) 
        if ((dec & mask) == 0) 
            array[count]='0';
        
        else 
            array[count]='1';
        
        count++;
        mask=mask>>1;
    
    return buf;
    

期望它返回 dec 的二进制表示,但打印它会产生随机垃圾。

【问题讨论】:

val 没有在任何地方定义。 '返回 buf;'返回指向具有自动存储的本地数组的指针 - UB。 array 超出范围。 'char *showBits(int dec, char *buf)' 传入 'buf' 是没有意义的,因为你用 'buf=array;' 覆盖它 似乎还有一个问题:您也没有以空值终止字符串。 【参考方案1】:

问题是您正在返回对本地数组的引用。相反,让调用者分配缓冲区。我还修复了代码中的一些其他问题:

#define MAX_BUFFER_LENGTH (sizeof(unsigned int) * CHAR_BIT + 1)

char *to_bit_string(unsigned int n, char *buf) 
    unsigned int mask = UINT_MAX - (UINT_MAX >> 1);
    char *tmp;

    for (tmp = buf; mask; mask >>= 1, tmp++) 
        *tmp = n & mask ? '1': '0';
    

    *tmp = 0;
    return buf;

首先,我们在这里使用 unsigned int 而不是signed int,因为signed int 与unsigned int 一起使用时会被转换为unsigned int。其次,无符号整数可以有不同的位数;所以我们使用sizeof(unsigned int) * CHAR_BIT + 1 来获得绝对最大位数。第三,我们使用UINT_MAX - (UINT_MAX &gt;&gt; 1) 作为一种方便的方法来获取一个只设置了最高有效位的值,无论该数字有多少个值位。第四:我们使用移动指针代替索引。第五 - 我们记得以空结尾的字符串。

用法:

char the_bits[MAX_BUFFER_LENGTH];
puts(to_bit_string(0xDEADBEEF, the_bits));

输出

11011110101011011011111011101111

【讨论】:

【参考方案2】:

你有

char *showBits(int dec, char *buf);

并且该函数应“返回 dec 的二进制表示”。

假设int 是 32 位,那么做

#define INT_BITS (32) // to avoid all those magic numbers: 32, 32-1, 32+1

进一步假设函数是这样调用的:

int main(void)

  int i = 42;  
  char buf[INT_BITS + 1]; // + 1 to be able to store the C-string's '0'-terminator.

  printf("%d = 0b%s\n", i, showBits(i, buf));

您可以按如下方式更改您的代码:

char *showBits(int dec, char *buf) 
  // char array[INT_BITS + 1]; // drop this, not needed as buf provides all we need
  // buf=array; // drop this; see above

  unsigned int mask = (1u << (INT_BITS - 1));
  size_t count = 0; // size_t is typically used to type indexes

  while (mask > 0) 
    if ((dec & mask) == 0) 
      buf[count] = '0'; // operate on the buffer provided by the caller. 
     else 
      buf[count] = '1'; // operate on the buffer provided by the caller. 
    

    count++;

    mask >>= 1; // same as: mask = mask >> 1;
  

  buf[INT_BITS] = '\0'; // '0'-terminate the char-array to make it a C-string.

  return buf;

也可以像这样使用该函数:

int main(void)

  ...

  showBits(i, buf);
  printf("%d = 0b%s\n", i, buf);

两种情况下打印的结果都应该是这样的:

42 = 0b00000000000000000000000000101010

【讨论】:

【参考方案3】:

稍加修改的代码 - 调用者应提供 buff 以适应字符串

char *showBits(unsigned int dec, char *buf) 
    unsigned int mask = 1u << 31;
    int count = 0;
    while (mask>0) 
        if ((dec & mask) == 0) 
            buf[count] = '0';
        
        else 
            buf[count] = '1';
        
        count++;
        mask = mask >> 1;
    
    buf[count] = '\0';
    return buf;

【讨论】:

以上是关于c语言关于打印指针所指的值的问题的主要内容,如果未能解决你的问题,请参考以下文章

c语言如何输出指针所指向的值

C语言面试题汇总之一

C语言面试题大汇总

C语言的一个问题

c语言里一般都说引用而不说使用,引用和使用有啥区别呢

c语言指针知识点总结