// // Created by Administrator on 2020/2/3. // #include <stdio.h> #include <stdlib.h> void test0(); void test1(); void swap(int a, int b); void swap2(int *x, int *y); void testArry(); void ptrArry(); void ptrArrayFor(); void ptr_base(); void ptr_caculate(); int main() { // test0(); // test1(); // // int a = 2, b = 3; // printf("交换前 a = %d, b = %d", a, b); swap(a, b); // swap2(&a,&b); // printf("交换后 a = %d, b = %d", a, b); // ptr_base(); ptr_caculate(); // testArry(); // ptrArry(); // ptrArrayFor(); return 0; } void ptr_caculate() { //指针的算数运算 //1,对于变量,不同的类型,占用的空间大小是不一样的 //2,对于不同类型的指针变量,他们占用的空间都是相同的 int i = 100; int *ptr_i = &i; printf("ptr_i=%p\n", ptr_i); printf("ptr_i+1=%p\n", ptr_i + 1); printf("ptr_i+2=%p\n", ptr_i + 2); char c = 100; char *ptr_c = &c; printf("ptr_c=%p\n", ptr_c); printf("ptr_c+1=%p\n", ptr_c + 1); printf("ptr_c+2=%p\n", ptr_c + 2); //指针占位步进长度与其所指类型有关 //只能进行加减法运算:+,-,++,--,+=,-= //两个指针进行计算必须是同类型 void *ptr_v = &c; printf_s("size of void = %p\n", sizeof(ptr_v)); } void ptr_base() { //空指针 int *ptr_i = NULL;//给初始化赋值为NULL,free之后置为NULL //*ptr_i这种操作是不允许的 //通用指针void* int n; char c; short s; //指针类型分别是int ,char ,short int *ptr_n = &n; char *ptr_c = &c; short *ptr_s = &s; printf("ptr_n=%p\n", ptr_n); void *ptr_void = ptr_n;//把一个整形指针转化成了一个通用指针,地址不会改变,但是类型信息丢失 printf("ptr_void=%p\n", ptr_void); int *ptr_n_1 = (int *) ptr_void; double *ptr_double = (double *) ptr_n;//语法正确,存在语义错误,编译器无法识别 } void ptrArrayFor() { int array[] = {1, 2, 3, 4, 5}; //int *ptr_array=&array;//错误的,把它当成了一个int类型的指针 //int (*ptr_array[4])=&array;//这里会编译报错,(*)[]=&array->(*)5[]类型不一致 int (*ptr_array)[] = &array;//数组指针 int *p = NULL; int i; for (int i = 0; i < 5; ++i) { printf("array[%d]=%d,*(array+%d) = %d\n", i, array[i], i, *(array + i)); printf("array[%d]=%p,*(array+%d) = %p\n", i, &array[i], i, array + i); } //以指针的方式遍历 for (p = array; p < array + 5; ++p) { printf("p=%p, *p = %d\n", p, *p); } } void ptrArry() { //数组指针与指针数组 //*【】 () //int (*ptr_array)[5]数组指针 //int *ptr_arr[5]指针数组 int array[] = {1, 2, 3, 4, 5}; int *ptr_array = array; printf("array = %d\n", array); printf("&array = %d\n", &array); printf("\n"); printf("array+1 = %d\n", array + 1); printf("array = %d\n", array); printf("&array+1 = %d\n", &array + 1); } void testArry() { int arry[] = {1, 2, 3, 4}; int *ptr_arry = &arry; printf("ptr_arry = %p\n", ptr_arry); printf("&arry = %p\n", &arry); printf("arry = %p\n", arry); printf("arry[0] = %p\n", &arry[0]); ptr_arry[2] = 100; *(ptr_arry + 3) = 200; printf("arry[2] = %d\n", arry[2]); //*(arry+3),*&arry[3],*(ptr_arry+3),*&ptr_arry[3]代表的是arry[3] printf("arry[3] = %d\n", arry[3]); printf("*&arry[3] =%d\n", *&arry[3]); printf("*(ptr_arry+3) =%d\n", *(ptr_arry + 3)); printf("*&(ptr_arry[3]) =%d\n", *&(ptr_arry[3])); //arry+3 ,&arry[3],ptr_arry+3,&ptr_arry[3]代表的是arry[3]的地址 printf("arry+3 = %d\n", arry + 3); printf("&arry[3] = %d\n", &arry[3]); printf("ptr_arry+3 = %d\n", ptr_arry + 3); printf("&ptr_arry[3] = %d\n", &ptr_arry[3]); } // 指针交换成功改变变量值 void swap2(int *x, int *y) { int temp = *x; *x = *y; *y = temp; } //值传递不能交换变量值 void swap(int a, int b) { int temp = a; a = b; b = temp; } void test1() { int i = 258; int j = 1000; int *ptr_i = &j; printf("%p\n", &i); printf("%p\n", &j); printf("ptr_i自己的地址%p\n", &ptr_i); printf("===========\n"); ptr_i = (int *) malloc(sizeof(int));//使用malloc函数在堆上分配内存给ptr_i printf("ptr_i自己的地址%p\n", &ptr_i); printf("ptr_i=%p\n", ptr_i);//指针指向的变量的地址,可以指向任何地址 free(ptr_i); //ptr_i悬空指针,野指针是一样危险的,必须避免 printf("ptr_i = %p\n", ptr_i); ptr_i = NULL; printf("ptr_i = %p\n", ptr_i);//0指针不能被访问 } void test0() { int i = 258; int *pri_i = &i;//存储另外一个变量的地址 printf("%p\n", &i); printf("%p\n", pri_i); printf("地址%p\n", &pri_i);//指针也是一种变量,他也会有自己的地址 };
C语言指针练习代码
最新推荐文章于 2023-04-14 16:48:12 发布