墨水熊

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
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;
}

 

posted on 2021-02-05 21:09  墨水熊  阅读(412)  评论(0编辑  收藏  举报