【查缺补漏】char*和char[]的区别、补码、字符串输入输出

int与char
整型变量在内存中是以二进制方式存储的
原码、反码、补码(8倍数位)
1、正数的原码、反码、补码都相同
2、负数符号位为1
原码、反码(除符号位都取反)、补码=反码+1

结论:负数是以补码形式存储在内存中的

如果最高位为1(负数),则需转为原码;而正数三码相同,最高位为0
负数是以补码形式实现运算的
1)得到负数的二进制原码
2)转码得到反码
2)反码+1得到补码
4)最后负数是以补码的方式与正数相加的
char c=129;//(在内存中为1000 0001)
%d会得到-127(因为%d会认为1000 0001是补码)

常见ASCII码(0-127 扩展:128-255)
A:65
a:97
0:48
空格:32
字符串结束符('\0'):0
  不是ASCII码:
   	EOF(-1):文件结束符

32位系统和64位系统
不同的地方在*p、size_t
*p  64位:8  32位:4
size_t    8        4
string    28       28

#include <stdbool.h> //bool 类型头文件

getchar、putchar、printf、sprintf、puts、gets
ch=getchar();//从键盘(设备)读取一个字符到ch,可以读取空格,返回int型

putchar(ch);//打印一个字符,返回int型

printf 在 linux 终端格式化输出颜色和定位

sprintf(str,"id:%s:%d","www","w");//结果:str="id:www:w"
//可以用该函数将数字转化成字符型数字

strcpy( dtm, "Saturday March 25 1989" );
sscanf( dtm, "%s %s %d  %d", weekday, month, &day, &year );//直接分开

char* gets(char* str)//从键盘输入一串字符到str,可输入空格,直到换行。

int* puts(const char* str)//输出str到屏幕
char[]和char*的区别

char* str=“aaa\0”;//结果仍会继续补一个'\0',即str的实际空间大小为5个字节,sizeof(str)为指针大小
char str[]={‘1’,‘2’,‘3’,‘4’,‘\0’};//sizeof(str)=5,若不用字符串常量赋值的话,需要手动添加’\0’
char[]不能改变指向,为指针常量
char*定义后仍能重新赋值,char\* str;str="11111";//合法
但是char*每次重新赋值地址都会改变,本质是指向了不同的字符常量,相当于常量指针,可以改变指向,但是不能改变指向元素的值,如:
char\* str="123456";
str[2]='2';//非法,无法改变元素的值
以下定义了一个char* str和一个char str1[]进行重赋值(str1无法重新赋值),还定义了另一个char* str2指向str,然后重新赋值
发现str1的指向和存储元素的值都没有改变。只是str和str2的指向,内存大小、元素值都变了。

#include<stdio.h>
#include<string.h>
int main()

{
        char *str="123456";
        char str1[]="123456";
        char* str2=str1;

        printf("str=%s\n",str);
        printf("strlen(str)=%ld\n",strlen(str));
        printf("str1=%s\n",str1);
        printf("strlen(str1)=%ld\n",strlen(str1));

        printf("地址:\n");
        printf("str=%p\n",str);
        printf("str1=%p\n",str1);
        printf("str2=%p\n",str2);
        //改变char* str的值及长度,发现可以改变,地址和内容改变
        //说明重新赋值改变了指向的内存空间,指向了另一个字符串常量
        str="123789111";
        //对指向字符数组的指针重新赋值,发现指针不再指向数组,且数组内容也未改变
        str2="1111111111";
        //str1="123553";//非法,数组名为指针常量,无法改变指向,但是可以改变指向元素的值
        printf("str=%s\n",str);
        printf("strlen(str)=%ld\n",strlen(str));

        printf("str1=%s\n",str1);
        printf("str2=%s\n",str2);
        printf("strlen(str1)=%ld\n",strlen(str1));
        printf("strlen(str2)=%ld\n",strlen(str2));
        printf("地址:\n");
        printf("str=%p\n",str);
        printf("str1=%p\n",str1);
        printf("str2=%p\n",str2);

        return 0;
}

结果:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值