C 与char*有关的指针

简单却容易疏忽的错误
printf中打印一个字符串,要牢记%s是从一个地址开始寻找字符串,遇到’\0’结束,如果从该地址开始没有’\0’就会报错
普通输出如%d,%f是直接打印值,不用取到地址所以这里要注意下。以下内容有点多,建议自己敲一遍代码,体会一下它们的区别

  1. 指向字符串常量的指针 char* p="asd";
//p指向"asd",此时"asd"是字符串常量,p->"asd"
//也就是说p仅仅指向这个字符串,只能打印出里面的内容,不能修改字符串里面的值
char* p="asd";
printf("%s\n",p); //打印asd
printf("%c",*p);//打印a
*p=‘A'; //报错,此时不能修改值
  1. 字符数组 char s[]="asd";
char s[]="asd";
printf("%s",s); //打印asd

printf("%s",s[0]); //错误,%s是从给定的位置打印字符直到遇到'\0',这里s[0]是一个字符

printf("%c",s[0]); //打印a
  1. 指向字符数组的指针 char* p=s;
char s[]="asd";
char *p=s; //此时p指向s 
printf("字符串内容:%s p的地址:%d p的值:%d s的地址:%d \n",p,&p,p,s);
// 在我的电脑上输出结果为字符串内容:asd p的地址:6487576 p的值:6487568 s的地址:6487568

说明此时p的值是s的地址,而printf("%s”,p)在p的值也就是s的地址找到一个字符串并输出

//接上
printf("%s",*p); //错误,此时*p是a
printf("%s",&p); //错误,&p是取p的地址,从该地址开始并没有字符串可读
  1. 字符串数组char* argv[]
const int MAX=100;

//argv是一个一维数组,其中数组的每一个元素都是一个指向字符类型对象的指针
char* argv[]={"qwe","asd","zxc"}; 

printf("%s",argv);// 乱码
//乱码的原因是argv是指针,它指向了3个指向字符串的指针,所以argv是它的值,而*argv才是它的值对应的指针
printf("%d %d %d\n",&argv,argv,*argv);
//输出结果argv的地址6487536 argv的值6487536 字符串"qwe"开始的位置4210692

printf("%s",*argv);//输出qwe 等同于argv[0]
printf("%s",*argv+1);//输出we 因为先取到第一个字符串的指针,再+1个位置输出
printf("%s\n",*(argv+1));//输出asd 这个写法等同于argv[1]

  1. 二维字符数组char s[][]
 char s[][5]={
 {"qwe"},
 {"asd"},
 {"zxc"}
 }; 
 prinf("%s",s[0][0]);//错误,这里s[0][0]是它的值
 printf("%s\n",&s[0][0]);//输出qwe 
 

部分参考《TCPL》,IDE devc++5.11

你可能感兴趣的:(C/C++)