c++学习--c和c++语言字符串指针在相互转化时的比较规则

c++:

using namespace std;

int main(int argc, char*argv[])
{
  //此处const 必须有                                                                                                                                                        
  const char *str = "abcdef";
  const char *cmp = "bcdef";
  //c++会检测类型,认为这个是常量字符串,如果我们不加const,会报warning                                                                                                     
  //warning: ISO C++11 does not allow conversion from string literal to 'char *'                                                                                            
  //char *str = "abcdef";                                                                                                                                                   
  //char *cmp = "bcdef";                                                                                                                                                    


  //下面的方式会引起段错误,因为*ptr不是字符串                                                                                                                              
  //    printf("What's *(++str): %c \n ", *(++str));                                                                                                                        
  //    printf("What's *cmp: %c \n ", *cmp);                                                                                                                                
  //如下正确,*ptr代表这个指针指向的字符                                                                                                                                    
  printf("What's *(++str): %c \n ", *(++str));
  printf("What's *cmp: %c \n ", *cmp);
  printf("checkout if char  equal %d \n", *(str)==*cmp);
  //c中,stp和cmp都是指针,我们这样比较,是比较这两个指针值是否相同。                                                                                                       
  printf("checkout if str  equal %d \n", str==cmp);

  //这种不经过类型转化的赋值,已经不被允许                                                                                                                                  
  //error: cannot initialize a variable of type 'long' with an lvalue of type 'const char *'                                                                                
  //long int t1 = str;                                                                                                                                                      
  //要想把指针转化成int值,我们要先把它转化成成长整类型                                                                                                                     
  long int t1 = (long int) str;
  int t2 =(int)t1;
  //在c++中,这种转化方式已经不被允许,因为指针的长度和long int相等。                                                                                                        
  //int t3 = (int)p_int;                                                                                                                                                    
  //c++很神奇,如果我们这样写,会报一个warning                                                                                                                              
  printf("what's str int  %d \n", str);
  //可是,如果我们这样写,会报错                                                                                                                                            
  //warning: comparison between pointer and integer ('const char *' and 'int')                                                                                              
  //  printf("what's str int  %d \n", (int)str);                                                                                                                            

  printf("checkout if equal(int to int) %d \n", (long int)str ==t2);
  //c++中,str是指针,不能直接和整形数值比较                                                                                                                                
  //printf("checkout if equal(int to str) %d \n", str == t2);                                                                                                               

  return 0;
}

编译警告:

g++ -std=c++11  c_cpp.cpp -o c_cpp
c_cpp.cpp:37:35: warning: format specifies type 'int' but the argument has type 'const char *' [-Wformat]
  printf("what's str int  %d \n", str);
                          ~~      ^~~
                          %s
1 warning generated.

运行结果:

What's *(++str): b
 What's *cmp: b
 checkout if char  equal 1
checkout if str  equal 0
what's str int  118779659
checkout if equal(int to int) 0

c:

#include<stdio.h>
#include<stdlib.h>



int main(int argc, char*argv[])
{
  const char *str = "abcdef";
  const char *cmp = "bcdef";

    //下面的方式会引起段错误,因为*ptr不是字符串                                                                                                                                      
    //    printf("What's *(++str): %c \n ", *(++str));                                                                                                                                
    //    printf("What's *cmp: %c \n ", *cmp);                                                                                                                                        
    //如下正确,*ptr代表这个指针指向的字符                                                                                                                                            
    printf("What's *(++str): %c \n ", *(++str));
    printf("What's *cmp: %c \n ", *cmp);
    printf("checkout if char  equal %d \n", *(str)==*cmp);
    //c中,stp和cmp都是指针,我们这样比较,是比较这两个指针值是否相同。                                                                                                               
    printf("checkout if str  equal %d \n", str==cmp);
    int p_int = (int) str  ;
    printf("what's str int  %d \n",(int) str);
    printf("what's p_int int  %d \n", p_int);
    printf("checkout if equal(int to int) %d \n", (int)str == p_int);
    //我们用指针和整形值进行比较,会报warning                                                                                                                               
    //warning: comparison between pointer and integer ('const char *' and 'int')                                                                                                      
    printf("checkout if equal(int to str) %d \n", str == p_int);

  return 0;
}

编译警告:

 gcc  -Wall c_cpp.c -o c_cpp
c_cpp.c:24:55: warning: comparison between pointer and integer ('const char *' and 'int')
    printf("checkout if equal(int to str) %d \n", str == p_int);
                                                  ~~~ ^  ~~~~~
1 warning generate

运行结果:

What's *(++str): b
 What's *cmp: b
 checkout if char  equal 1
checkout if str  equal 0
what's str int  188321487
what's p_int int  188321487
checkout if equal(int to int) 1
checkout if equal(int to str) 0


猜你喜欢

转载自blog.csdn.net/u010029439/article/details/80643149