c++最终还是要学习的啊 不然真的很难理解 这些到底都是怎么一回事啊
#define _CRT_SECURE_NO_WARNINGS//关闭安全警报 #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> using namespace std;//命名空间 int xuexi1() { char* str1 =(char *)malloc(30*sizeof(char)); //在指针str1中开辟30个char的空间,该变量本例不使用 //const表明为常量 理论上不能更改 但可以使用指针定位到该内存进行更改 char cc = 't'; printf("%c", cc); printf("\n"); printf("%p", cc); printf("\n ---以上例1---\n"); //注意:指针定位到char 是无法修改的 只能修改char的数组或者说他的指针集 因为char是向ascii表取值来获取字符 //对ascii更改会造成整个系统的该字符都发生变化或直接蓝屏死机,当然大部分系统都不会让其执行该操作,但dos就说不好了 const char str1_c1[30] = "apple"; //注意""双引号为字符串适用 单引号为字符适用,混淆会造成字符不准确 //使用char的数组也能开辟空间 为30 只占用6位 前五位字母 后一位为\0 表明字符串的截止 #if 1//当为0时 该if内为注释不执行 //也可以使用以下声明字符串 const char strl_c2[] = "apple"; const char strl_c3[] = { 'a','p','p','l','e','\0' };// 字符串为各个字符组成所以{}内为单引号,此方法赋值不会结尾自动加\0,需手动添加 //注意:如此声明最后不会自动填加\0 造成电脑无法获知该字符串结尾,所以要手动添加。另外只要声明开辟的空间,未赋值皆为\0 printf("%s", strl_c3); printf("\n"); printf("%p", strl_c3); printf("\n ---以上例2---\n"); #endif //好 继续 const char str1_c[30] = "apple";//重新声明一个 printf("%p", str1_c);//打印该常量的地址 printf("\n"); printf("%s", str1_c);//打印该常量的值,为字符串格式 printf("\n ---以上例3---\n"); char* c; //声明一个char指针 c = (char *)&str1_c;//取出常量的地址转换为char的指针赋值给c 这样就将c和str1_c 共同指向了同一个内存地址 *c = 'o';//対c赋值 print(str1_c);//我写了一个函数 来作为打印 方便阅读 printf("\n ---以上例4---\n");//可以看到 apple的头一个字母改为了o c = c + 1;//将c指针后移 来改写后面的值 *c = 'r'; c = c + 1; *c = 'a'; c = c + 1; *c = 'n'; c = c + 1; char str_ge[3]="ge" ;//如果觉得这么写太慢了 也可以使用strcpy函数,将字符串值拷贝至一个指针位置 strcpy(c, str_ge);//在高版本vs中使用 要在代码开头添加#define _CRT_SECURE_NO_WARNINGS 来关闭使用安全版本的警告报错 printf("指针c %s", c);//由于%s 所以打印一个字符串 即便c是字符类型也无碍 该函数会寻找\0为结尾 打印前面的所有字符 printf("\n"); printf("指针c %p", *c);//只打印出字符g的ascii码 printf("\n"); printf("str1_c %p", str1_c); printf("\n"); printf("str1_c %s", str1_c); printf("\n ---以上例5---\n"); //至此结束 如果对于以上依感迷茫 推荐使用高版本的vs进行断点调试,并在调试中,点击菜单-调试-窗口-内存-内存1 来更直观的了解字符在内存中的表现形式 return 0; } int main() { xuexi1(); return 0; }