白云点缀的蓝 发表于 2021-6-23 00:21

学习c\c++时的练习





#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#define RETURN 0;
//1 野指针
int main1() {
        int* p;
        p = 100;
        printf("%d\n", p);//100
        //printf("%d\n", *p);//访问权限冲突
}
//2 空指针
int main2() {
        main1();
        int* p = NULL;
        int* p1 = 0x00000000;
        //printf("%d\n",*p);//nullptr
        //printf("%d\n", *p1);//nullptr
        printf("%d\n", p);//0
        printf("%d\n", p1);//0
        printf("%X\n", p);//0
        printf("%X\n", p1);//0
        return RETURN;
}
//3 万能指针
int main3() {
        int num = 100;
        void* p = #
        printf("%d\n",p);//9435172
        printf("%d\n",(int *)p);//9435172
        printf("%x\n",p);//8ff824
        printf("%x\n", (int*)p);//8ff824
//        printf("\n", *p);//无法编译通过
        printf("%d\n",*(int*)p); //100
        char s = 'A';
        void* ps = s;
        //printf("%x\n",*(char * )ps);//异常
        printf("%x\n", (char*)ps);//41
        printf("%d\n",(char * )ps);//65
        unsigned long num1 =12345678 ;
        void* p2 = &num1;
        printf("%d\n", *(int*)p2);//12345678
        printf("%d\n",*(unsigned long *)p2);//12345678
        return RETURN;

}
//4const修饰的指针变量
void main4() {
        int num = 100;
        const int* p = #
        //*p = 20;//无法编译通过
        p = NULL;
        printf("%x\n", p);//0
        int * const p1 = #
        *p1 = 20;
        printf("%d\n",*p1);//20
        //p1 = 200;//无法编译通过
        const int* const p2 = #
        //*p2 = 20;//无法编译通过
        //p2= 100;//无法编译通过
        return ;
}
//5 多级指针
int main5() {
        int a = 666;
        printf("%X\n", &a);//EFFE30
        int* p = &a;
        printf("%X\n", p);//EFFE30
        int** p1 = &p;
        printf("%X\n", p1);//EFFE24
        printf("%X\n", *p1);//EFFE30
        printf("%X\n", ** p1);//29A=666
        return RETURN;
}
//6指针结合数组
int main() {
        char dis[] = "hello";
        char res[] = "world";
        int lengthres= sizeof(res) / sizeof(res);
        int lengthres2 = sizeof(dis) / sizeof(dis);
        extern char* my_strcopy(char* res, char* dis, int lengthres, int lengthres2);
        extern char* my_strcopy2(char* res, char* dis,int lengthres,int lengthres2);
        char* p = my_strcopy2(res, dis, lengthres, lengthres2);
        char *p2= my_strcopy2(res, dis, lengthres, lengthres2);
        printf("%X\n", p);//1658A60
        printf("%X\n", p2);//1658A60
        printf("%s\n", p);//hellworld
        printf("%s\n", p2);//hellworld
        free(p);//释放内存
        free(p2);//释放内存
        printf("%X\n", p);//1658A60
        printf("%X\n", p2);//1658A60
        printf("%s\n", p);//葺葺葺葺葺葺葺葺葺葺
        printf("%s\n", p2);//葺葺葺葺葺葺葺葺葺葺
        return RETURN;
}
char * my_strcopy(char * res,char * dis, int lengthres, int lengthres2){
        printf("%d%d\n", lengthres, lengthres2);//6//6
        printf("%X\n", res);
        printf("%d\n", sizeof(res) / sizeof(res));//4
        printf("%d\n", sizeof(dis) / sizeof(dis));//4
        printf("%X\n", dis);
        int strlength=strlen(dis);
        int strlength2 = strlen(res);
        char *p= malloc(strlength + strlength2 + 1);
        printf("%d\n", strlength);
        int num1 = 0;
        int num2= 0;
        for (size_t i = 0; i < strlength; i++)
        {
                p = dis;
                num1 = i;
        }
        for (int i = 0; i < strlength2; i++)
        {               
                        p = res;
                        num2 = i;
                        if (i == 4) {
                                p ='\0';
                        }
        }
        //p = '\0';
        printf("%s\n", p);//hellworld
        return p;
}
char* my_strcopy2(char* res, char* dis, int lengthres, int lengthres2) {
        printf("%d%d\n", lengthres, lengthres2);//6//6
        printf("%X\n", res);
        printf("%d\n", sizeof(res) / sizeof(res));//4
        printf("%d\n", sizeof(dis) / sizeof(dis));//4
        printf("%X\n", dis);
        int strlength = strlen(dis);
        int strlength2 = strlen(res);
        char* p = malloc(strlength + strlength2 + 1);
        printf("%d\n", strlength);
        int num1 = 0;
        int num2 = 0;
        for (size_t i = 0; i < strlength; i++)
        {
                //p = dis;
                *(p + i) = *(dis + i);
                num1 = i;
        }
        for (int i = 0; i < strlength2; i++)
        {
                //p = res;
                *(p + num1 + i) = *(res + i);
                num2 = i;
                if (i == 4) {
                        p = '\0';
                }
        }
        //p = '\0';
        printf("%s\n", p);//hellworld
        return p;
}
//7 指针运算
int main9() {
        int* arr;
        int a;
        for (int i = 0; i < sizeof(arr)/sizeof(arr); i++)
        {
                srand(time(0));
                *(a + i) = rand();
                arr = &a;
                //Sleep(1000);
        }
        for (inti = 0; i < sizeof(arr)/sizeof(arr); i++)
        {
                printf("%d\n",*arr);
        /*
                        3208
                        3212
                        3215
                        3218
                        3221
                        3225
                        3228
                        3231*/
        }
        printf("%X\n", arr);//8FF96C
        printf("%X\n", arr);//8FF954
        printf("%X\n", arr - arr);//7,中间相差7个元素
        return RETURN;
}
//8 []并不是数组的专属
int main10() {
        int num;
        int length = sizeof(num) / sizeof(num);
        for (int i = 0; i < sizeof(num) / sizeof(num); i++)
        {       
                num = i;//100个值
        }
        for (int i = 0; i < sizeof(num)/sizeof(num); i++)
        {
                printf("%d\n", num);//100个值

        }
        for (int i = 0; i < length; i++)
        {
                printf("%X\n", (num + i));//num里的值的地址
        }
        for (int i = 0; i < length; i++)
        {
                printf("%d\n", *(num + i));//num的值
        }
        int num1 = 100;
        int* p = &num1;
        *p = 200;
        printf("num1=%d\n", num1);
        printf("&num1=%X\n",&num1);
        printf("p=%X\n", p);
        //p = 500;
        p = 500;
        printf(" p == 500 ? 1:2=%d\n", p == 500 ? 1:2);
                /*num1=200
                &num1=25F7E8
                p=C8
               p == 500 ? 1:2=1*/
        return RETURN;
}
//9 指针数组
int main6() {
        int* a;
        int b = 100;
        int c = 200;
        int d = 300;
        a = &b;
        a = &c;
        a = &d;
        //a = &a;//数组越界
        int length = sizeof(a) / sizeof(a);
        for (int i = 0; i < sizeof(a)/sizeof(a); i++)
        {
                printf("%X\n",a);
                        /*
                        EFFBD4 &c
                        EFFBE0 &b
                        EFFBC8 &d
                        */
        }
        for (int i = 0; i < sizeof(a)/sizeof(a); i++)
        {
                printf("%d\n", *a);
        /*                200
                        100
                        300*/
        }
        for (int i = 0; i <length ; i++)
        {
                //printf("%d\n", a);//‭5CFC50‬
                printf("**(a + i)%d\n", **(a + i));//200 100 300
                printf(" *(a + i)%X\n", *(a + i));//c b d的地址
                printf("(a + i)%X\n", (a + i));//a数据的地址
                printf("%X\n", &a);//a数据的地址

        }
        return RETURN;
}
//10 指针作为函数的形参,并且改变实参的值
swapNum(int* num11, int* num22) {
        int tmp = *num11;
        *num11 = *num22;
        *num22 = tmp;
}
int main7() {
        int num1 = 100;
        int num2 = 200;
        extern swapNum(int* num11, int* num22);
        swapNum(&num1, &num2);
        printf("%d\n", num1);//200
        printf("%d\n", num2);//100
        return RETURN;
}

//11数组作为函数的形参
int main11() {
        extern int* myPrint(int a[], int b[]);
        extern int* myPrint1(int a[], int b[],int lengthA,int lengthB);
        int a[] = { 1,2,3,4,5,6,7,8,9,10 };
        int b[] = { 11,22,33,44,55,66,77,88,99,00 };
        myPrint1(a, b,sizeof(a)/sizeof(a), sizeof(b) / sizeof(b));
}
int* myPrint(int a[], int b[]) {
        int lengthA = sizeof(a) / sizeof(a);
        int lengthB = sizeof(b) / sizeof(b);
        printf("%d\n", lengthA);
        printf("%d\n", lengthB);
        for (int i = 0; i < lengthA; i++)
        {       
                printf("%d\n", a);
        }
        for (int i = 0; i < lengthB; i++)
        {
                printf("%d\n", b);
        }
        return NULL;
}
int* myPrint1(int a[], int b[],int lengthA, int lengthB) {
        /*int lengthA = sizeof(a) / sizeof(a);
        int lengthB = sizeof(b) / sizeof(b);*/
        printf("%d\n", lengthA);
        printf("%d\n", lengthB);
        for (int i = 0; i < lengthA; i++)
        {
                printf("%d\n", a);
        }
        for (int i = 0; i < lengthB; i++)
        {
                printf("%d\n", b);
        }
        /*10
                10
                1
                2
                3
                4
                5
                6
                7
                8
                9
                10
                11
                22
                33
                44
                55
                66
                77
                88
                99
                0*/
        return NULL;
}
//12指针作为函数的返回值
int main8() {
        int num = 100;
        extern int* add(int* num11, int* num22);
        int num1 = 200;
        printf("%X\n", add(&num, &num1));//97FB08
        printf("%d\n", *(add(&num, &num1)));//300
        return RETURN;
}
int * add(int* num11, int* num22) {
        int Num= (*num11 + *num22);
        return &Num;
        //return NULL ;//防止报错
}

tlf 发表于 2021-6-23 05:21

Didor 发表于 2021-6-23 08:52

大学时学C/C++时最头疼的就是指针了

andu 发表于 2021-6-23 09:02

lihai

EliVenom 发表于 2021-6-23 09:21

学C的指针时真的脑壳疼,但真的很强{:301_1008:},加油

zz0eyu 发表于 2021-6-23 11:06

这个背景真心不错
最近也在学习C++

alicc 发表于 2021-6-23 11:38

大佬 你看的那个教程我也学习

kentish 发表于 2021-6-23 12:01

感谢分享 能够重温一次

白云点缀的蓝 发表于 2021-6-24 12:08

alicc 发表于 2021-6-23 11:38
大佬 你看的那个教程我也学习

链接:https://pan.baidu.com/s/1mIQ-RydkWQFqmF9kSJ54dg 提取码:1321 复制这段内容后打开百度网盘手机App,操作更方便哦

alicc 发表于 2021-6-24 12:56

bsjasdq 发表于 2021-6-24 12:08
链接:https://pan.baidu.com/s/1mIQ-RydkWQFqmF9kSJ54dg 提取码:1321 复制这段内容后打开百度网盘手机App ...

谢谢               
页: [1] 2
查看完整版本: 学习c\c++时的练习