指针输出令我困惑

时间:2017-06-20 06:53:58

标签: c++ c pointers

我的代码在这里

<?php
header("Content-type: text/xml");
$i=0;
$xml = '<?xml version="1.0" encoding="UTF-8"?>';
$xml.= "\n".'<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
  $db = new PDO('mysql:host=xxx;dbname=xxx', 'xx', 'xxx');
  $stmt[$i] = $db->query('SELECT count(*) FROM wp_term_taxonomy WHERE taxonomy="product-cat" || taxonomy="product-brand"');
  $rowcount = $stmt[$i]->fetchColumn();
      for ($i=0; $i<2; $i++)
      {
        $sth[$i] = $db->query('SELECT term_id FROM wp_term_taxonomy WHERE taxonomy="product-cat" || taxonomy="product-brand"');
        $t_id[$i] = $sth[$i]->fetchColumn();
        $stmt[$i] = $db->query('SELECT taxonomy FROM wp_term_taxonomy WHERE term_id = '.$t_id[$i].'');
        $t_taxonomy[$i] = $stmt[$i]->fetchColumn();
        $stmt[$i] = $db->query('SELECT slug FROM wp_terms WHERE term_id = '.$t_id[$i].'');
        $t_slug[$i] = $stmt[$i]->fetchColumn();
      }
        echo $xml;
     for ($i=0; $i<2; $i++)

      {

        $xml.= "\n\t\t".'<url>'."\n";
        $xml.= "\t\t\t".'<loc>'."http://example.com/search-page/?$t_taxonomy[$i]=$t_slug[$i]"."\t$t_id[$i]\t$i\t$rowcount".'</loc>';
        $xml.= "\n\t\t\t".'<changefreq>always</changefreq>';
        $xml.= "\n\t\t\t".'<priority>1.0</priority>';
        $xml.= "\n\t\t".'</url>'."\n";
      }
    ?>


<?php 
$xml.= "\n".'</urlset>';
$handle = fopen('sitemap_custom.xml','w+');
fwrite($handle,$xml);
fclose($handle);
?>

输出

  

44

     

1

任何机构都可以解释它。

3 个答案:

答案 0 :(得分:1)

我们知道int数据类型的大小为2 bytes4 bytes取决于您的系统。而char指针一次指向一个字节。

int a = 300;的内存表示

ptr 因此,char指针p仅指向第一个字节,如上图所示。

所以,首次打印 44 输出。

然后,

printf("%d",*++p);

第一个p是递增,指针指向下一个(第二个)字节。因此,下一个字节输出为1

答案 1 :(得分:0)

a太大而无法在一个字节上表示,因为它的二进制表示至少为0000000100101100取决于int类型获得的字节数。在此表示中获得2个字节,但是,它可以有4或8个,或其他大小,平台相关的)。

执行char *p=(char *)&a;后,您只需查看a - 00000001---00101100的一个字节 - 右侧部分,其值为44。

当移动到下一个字节位置(++p)时,那里的字节是左边的部分(00000001),它的值是1

答案 2 :(得分:0)

您获得这些值的原因是因为您将int内存位置视为两个char内存位置(如果您知道自己正在做什么,当然可以)。您的原始int a在内存(字节视图)中表示如下:

[0x2c=44] [0x01=1]组合时0x12c为300.

对您的代码进行以下修改有助于更好地理解此

#include <stdio.h>

int main(int argc, char** argv)
{   
    int i;
    int a=300;
    char *p=(char*)&a;
    for (i=0;i<sizeof(a);i++)
    {   
        printf("[0x%02x] ", p[i]);
    }
    printf("\n");
}