【无标题】指针和数据结构

#define _CRT_SECURE_NO_WARNINGS
#include
//int my_strlen(char* arr)
//{
//    char* start = arr;
//    while (*arr != '\0')
//    {
//        arr++;
//    }
//    return arr - start;
//}
//int main()
//{
//    int len = my_strlen("djfaifjrj");
//    printf("%d", len);
//    return 0;
//}


//int main()
//{
//    int arr[10] = { 0 };
//    int i = 0;
//    int* p = arr;
//    int sz = sizeof(arr) / sizeof(arr[0]);
//    for (i = 0; i < sz;i++)
//    {
//        printf("%d ", *(p + i));
//    }
//    return 0;
//}

//
二级指针
//int main()
//{
//    int a = 10;
//    int* pa = &a;
//    
//    int** ppa = &pa;//ppa来存放pa的地址,ppa是二级指针变量
//    **ppa = 20;
//    printf("%d\n", a);
//    return 0;
//}


指针数组
——就是存放指针的数组
//int main()
//{
//    int a = 10;
//    int b = 20;
//    int c = 30;
//    int arr[10];
//    int *pa = &a;
//    int* pb = &b;
//    int* pc = &c;
//    int* parr[10] = { &a,&b,&c };
//    int i = 0;//这个数组每个元素都是整型指针
//    for (i = 0;i < 3;i++)
//    {
//        printf("%d ", *(parr[i]));
//    }
//    return 0;
//}
//指针数组可以实现模拟二维数组
int main()
{
    int arr1[4] = {1,2,3,4};
    int arr2[4] = {1,2,6,7};
    int arr3[4] = {4,7,3,4};
    int* parr[3] = { arr1,arr2,arr3 };
    int i = 0;
    for (i = 0;i < 3;i++)
    {
        int j = 0;
        for (j = 0;j < 4;j++)
        {
            printf("%d ", parr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

//数据类型详细介绍
//int main()
//{
//    //内置类型
//    //char//short// int// long // long long// float// double
//    //sizeof (long)>=sizeof(int)(取决于平台是32位还是64位平台
//    //决定了申请的内存空间大小(大小决定了适用范围)
//    //字符的本质是ASCII码值,是整型,属于整型家族
//    // int a ---->signed int a
//    // char是signed char还是unsigned char取决于编译器,标准是未定义的
//    // 
//    // 
//    // 构造类型(自定义类型)
//    // 结构体类型struct
//    // 数组类型
//    // 枚举类型
//    // 联合类型
//    // 
//    // 
//    // 指针类型
//    // 
//    // 
//    // 空类型
//    // void通常用于函数返回类型,函数的参数,
//    // 
//    // 
//    // 一般表示2进制序列的时候为了表示方便,会将每四位二进制序列写为十六进制序列,并在头上加上0x以表示这是二进制序列
//    //整数内存里存的是二进制补码
//    // 使用补码,将数值位和符号位统一处理
//    // 同时加法和减法也会统一处理(CPU只有加法器)
//    // 此外,将补码和原码相互转换,其运算过程是相同的,不需要额外的电路
//    // 
//    // 将补码转化为原码也可以取反加一(故运算过程相同)
//    // 
//    // 
//    // 
//    // 大小端(实际上存的还是二进制)
//    // 【 11 22 33 44                                 44 33 22 11                】
//    // 低地址                                         高地址
//    //     大端字节序存储                               小端字节序存储
//    // 一个数据高位字节序内容存放在低地址处             高位字节序内容放在高地址处
//    // 把低位字节序内容存放在高地址处                   低位字节序内容存放在低地址处 
//    // vs编译器是按小端字节序存储的
//    // 对于一个字节的数据没有字节序好谈
//    // 
//    //设计一个程序判断当前机器字节序
//    int a = 1;
//    //关键就在于大小端存储最低地址的字节一定不同(对于1而言)
//    //指针类型决定了解引用访问时访问几个数组
//    if (*(char*)&a == 0)
//    {
//        printf("您的机器是大端存储");
//    }
//    else 
//    {
//        printf("您的机器是小端存储");
//    }
//
//    return 0;
//}
//#include
//int main()
//{
//    unsigned int i;//没有正负之分,每一位都是有效位
//    //i一定>=0
//    for (i = 9;i >= 0;i--)
//    {
//        printf("%u\n", i);
//        Sleep(2000);
//    }
//    return 0;
//}
//10000000000000000000000000000001
//11111111111111111111111111111110
//11111111111111111111111111111111无符号数也要看补码

//char类型元素取值范围是-128~127,unsigned char 的取值范围是0~255
//strlen求字符串长度,关注的是‘\0’前的字符数
//大部分编译器大部分的char都是signed char
//strlen 返回的类型是size_t,是无符号整型
//无符号数减去无符号数得到的是无符号数,将负数看为无符号数的时候会得到一个非常大的值
//一个无符号数与一个有符号数进行运算的时候,会将有符号数转化为无符号数

//浮点型在内存中的存储
// (-1)^s * M * 2^E
// (-1)^s表示符号位,当S= 0,V为整数;当S = 1,V位负数
// M表示有效数字,大于等于1,小于2;
// 2^E表示指数位
// 
// 小数点后第一位权重是二的负一次方
// 
// M大于等于一,在存的时候,第一位1被舍去,这样就多了一位有效数字,后面补零
// 
// 对于E,首先E是一个无符号整数,E为八位时,他的取值范围是0~255,E为十一位时,取值范围是0~2047
// 但是E又可以出现负数,则转入内存时E的真实值必须再加上一个真实值,对于八位的E,这个中间数是127,对于32位的E,这个中间数是1023
// 
// 当把E从内存中取出的时候,还分为三种情况
// 1.E不全为零或不为全一
// 指数E得计算值减去127(或者1023),得到真实值,再将M前补1
// 2.E为全零
// 这时,浮点数的指数E等于1-127(或者1-1023),即为真实值
// 有效数字M不再加上第一位的一,而是还原为0.xxxxxx的小数,这样做是为了表示±0
// 3.E为全1,如果这时有效数字M为全零,表示±无穷大
//

//int main()
//{
//    float f = 5.5;
//    //101.1
//    //(-1)^0 * 1.011* 2^2
//    //S存0,E存129,M存011
//    return 0;
//}
//0 00000000 00000000000000000001001
// E = - 126
// M = 00000000000000000001001
// S = 0
// 
// 1001.0
// 1.001*2^3
// S=0,M=1.001,E=3
// 0 10000010 00100000000000000000000
// 
//


喝汽水问题
//int main()
//{
//    int money = 20;
//    int total = 20;
//    int empty = total;
//    while (empty > 1)
//    {
//            total += empty/2;
//            empty = empty / 2 + empty % 2;
//    }
//    printf("%d", total);
//    return 0;
//}


//对一句话的单词进行逆序,标点不变,单词本身不变
#include
#include
void reverse(char* left, char* right)
{
    assert(left);
    assert(right);
    while (left < right)
    {
        char tmp = *left;
        *left = *right;
        *right = tmp;
        left++;
        right--;
    }
}
int main()
{
    char arr[101] = { 0 };
    gets_s(arr, 101);
    int len = strlen(arr);
    reverse(arr, arr + len -1);
    char* start = arr;
    char* end = start;
    while (*start != '\0')
    {
        while (*end != ' ' && *end != '\0')
        {
            end++;
        }
        reverse(start,end-1);
        if (*end != '\0')
        {
            end++;

        }
        start = end;
    }
    printf("%s", arr);
    return 0;
}

你可能感兴趣的:(算法,数据结构)