zoukankan      html  css  js  c++  java
  • c++ 利用指针改变常量的值

    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("
    ");
        printf("%p", cc);
        printf("
     ---以上例1---
    ");
        //注意:指针定位到char 是无法修改的 只能修改char的数组或者说他的指针集 因为char是向ascii表取值来获取字符 
        //对ascii更改会造成整个系统的该字符都发生变化或直接蓝屏死机,当然大部分系统都不会让其执行该操作,但dos就说不好了
        
        const char str1_c1[30] = "apple";
        
        //注意""双引号为字符串适用 单引号为字符适用,混淆会造成字符不准确
        //使用char的数组也能开辟空间 为30 只占用6位 前五位字母 后一位为 表明字符串的截止
        
    #if 1//当为0时 该if内为注释不执行
        //也可以使用以下声明字符串
        const char strl_c2[] = "apple";
        const char strl_c3[] = { 'a','p','p','l','e','' };// 字符串为各个字符组成所以{}内为单引号,此方法赋值不会结尾自动加,需手动添加
        //注意:如此声明最后不会自动填加 造成电脑无法获知该字符串结尾,所以要手动添加。另外只要声明开辟的空间,未赋值皆为 
        printf("%s", strl_c3);
        printf("
    ");
        printf("%p", strl_c3);
        printf("
     ---以上例2---
    ");
    #endif
        
        //好 继续
        const char str1_c[30] = "apple";//重新声明一个
        printf("%p", str1_c);//打印该常量的地址
        printf("
    ");
        printf("%s", str1_c);//打印该常量的值,为字符串格式
        printf("
     ---以上例3---
    ");
        char* c; //声明一个char指针 
        c = (char *)&str1_c;//取出常量的地址转换为char的指针赋值给c 这样就将c和str1_c 共同指向了同一个内存地址
        *c = 'o';//対c赋值 
        print(str1_c);//我写了一个函数 来作为打印 方便阅读
        printf("
     ---以上例4---
    ");//可以看到 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是字符类型也无碍 该函数会寻找为结尾 打印前面的所有字符
        printf("
    ");
        printf("指针c %p", *c);//只打印出字符g的ascii码
        printf("
    ");
        printf("str1_c %p", str1_c);
        printf("
    ");
        printf("str1_c %s", str1_c);
        printf("
     ---以上例5---
    ");
        //至此结束 如果对于以上依感迷茫 推荐使用高版本的vs进行断点调试,并在调试中,点击菜单-调试-窗口-内存-内存1 来更直观的了解字符在内存中的表现形式
        return 0;
    }
    int main()
    {
        xuexi1();
        return 0;
    }
  • 相关阅读:
    express不是内部或外部命令,也不是可运行的程序或批处理文件
    Microsoft VBScript 运行时错误 错误 '800a0046' 没有权限 解决方法
    Scripting.FileSystemObject对象的详细技巧指南
    (asp)JScript读写、复制、移动文件 asp也就那回事(4)
    SQL2000系统表、存储过程、函数的功能介绍及应用
    深入浅出:全面理解SQL Server权限体系
    SqlServer2008基础知识:安全与权限
    php-fpm
    PHP获取当前url路径的函数及服务器变量:$_SERVER["QUERY_STRING"],$_SERVER["REQUEST_URI"],$_SERVER["SCRIPT_NAME"],$_SER
    jQuery UI Datepicker中文显示
  • 原文地址:https://www.cnblogs.com/moshuixiong/p/14379758.html
Copyright © 2011-2022 走看看