int main()
//{
// char ch = 'w';
// char* p = &ch;
// *p = 'a';
// printf("%c ", ch);
// return 0;
//}
//
//int main()
//{
// const char* ch = "abc";
// printf("%s\n", ch);
// return 0;
//}
//
//
//int main()
//{
// char str1[] = "hello bit.";
// char str2[] = "hello bit.";
// const char* str3 = "hello bit.";
// const char* str4 = "hello bit.";
// if (str1 == str2)
// printf("str1 and str2 are same\n");
// else
// printf("str1 and str2 are not same\n");//打印
//
// if (str3 == str4)
// printf("str3 and str4 are same\n");//打印
// else
// printf("str3 and str4 are not same\n");
//
// return 0;
//}
//
//int main()
//{
// int a = 0;
// printf("%d\n", a);
// char ch = 'w';
// printf("%c\n", ch);
// char* num = "abc";
// printf("%s\n", num);
// char arr[] = "def";
// printf("%s\n", arr);
// return 0;
//}
//
//
//int main()
//{
// int* p1[10];//指针数组,指针数组是⼀种数组,数组中存放的是地址(指针)。
// int(*p2)[10];//数组指针变量应该是:存放的应该是数组的地址,能够指向数组的指针变量。
// return 0;
//}
//
//
//int main()
//{
// int arr1[10] = { 10 };
// int arr2[10] = { 2 };
//
//
// int* p1 = &arr1;//指针数组,初始化
//
// int(*p2) = &arr2;//数组指针,初始化
//
// printf("%d\n", *arr1);
// printf("%d\n", *arr2);
// return 0;
//}
//
//int main()
//{
// int* ptr = NULL;//空指针
// *ptr = 10;//nullprt(空指针)
// printf("%d ", ptr);
// return 0;
//}
//
//
//int main()
//{
// int a = 10;
// int* p = &a;
// if (p != NULL)
// {
// //使用p
// }
// return 0;
//}
//
//
//&arr[0]-数组首元素地址
//&arr-数组名也代表首元素地址
//int main()
//{
// int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
// int* p = &arr;
// int i = 0;
// int sz = sizeof(arr) / sizeof(arr[0]);
// for (i = 0; i < sz; i++)
// {
// printf("%d ", *p);
// p++;
// }
// 在这里继续使用p的话p就是野指针
// //p = NULL;
//
// .....
// //p = arr;
// //if (p != NULL)
// //{
// // //使用p
// //}
// return 0;
//}
//
//
//int* test()//所以是int *类型
//{
// //局部变量
// int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
//
// //....
//
// return arr;//返回arr地址
//}
//int main()
//{
// int* p = test();
// //p就是野指针
// return 0;
//}
//
//#define NDEBUG//assert开关
//#include<assert.h>
//
//int main()
//{
// int a = 10;
// //int* p = &a;
// int* p = NULL;
// //assert() 宏接受⼀个表达式作为参数。如果该表达式为真(返回值⾮零), assert() 不会产⽣
// // 任何作⽤,程序继续运⾏。如果该表达式为假(返回值为零), assert() 就会报错,在标准错误
// // 流 stderr 中写⼊⼀条错误信息,显⽰没有通过的表达式,以及包含这个表达式的⽂件名和⾏号。
// assert(p != NULL); //如果是NULL直接报错(用来排查问题)
//
// return 0;
//}
//
//
//#include<math.h>
//
//void Swap(int x, int y)
//{
// int z = x;
// x = y;
// y = z;
//}
//int main()
//{
// int a = 10;
// int b = 20;
// printf("交换前a = %d, b = %d\n", a, b);
// //传值调用,函数的实参传递给型参后,形参是实参的临时拷贝,形参有自己独立的空间
// //所以对形参的修改不能影响实参
// Swap(a, b);
// printf("交换后a = %d, b = %d\n", a, b);
// return 0;
//
//}
//
//
//void Swap(int* x, int* y)
//{
// int z = *x;
// *x = *y;
// *y = z;
//}
//int main()
//{
// int a = 10;
// int b = 20;
// printf("交换前a = %d, b = %d\n", a, b);
// //传址调用
// Swap(&a, &b);
// printf("交换后a = %d, b = %d\n", a, b);
// return 0;
//}
//
//
//int Max(int x, int y)
//{
// if (x > y)
// {
// return x;
// }
// else
// return y;
//}
//int main()
//{
// int a = 100;
// int b = 20;
//
// //传值调用
// int m = Max(a, b);
// printf("%d ", m);
// return 0;
//}
//
//
//健壮性/鲁棒性
//
//size_t 无符号整形
//size_t my_stelen(const char *str)//不能修改
//{
// int count = 0;
// assert(str != NULL);//确保了指针的有效性
// while (*str != '\0')
// {
// count++;
// str++;
// }
// return count;
//}
//int main()
//{
// char arr[] = "hello hongyang";
// size_t len = my_stelen(arr);
// printf("%zd\n", len);
// return 0;
//}
//
//
//
//int main()
//{
// int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
// printf("%p\n", &arr[0]);
// printf("%p\n", arr);
// //数组名就是数组首元素地址
// //但是有2个例外
// //1.sizeof(数组名),这里的数组名表示整个数组,sizeof(数组名)计算的是整个数组的大小,单位是字节
// // 2. &数组名,这里的数组名表示整个数组,&数组名:去出的是整个数组的地址
// //除此之外遇到的所有的数组名都属数组元素的首地址
//
// return 0;
//}
//
//int main()
//{
//
// int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
// printf("&arr[0] = %p\n", &arr[0]);
// printf("&arr[0]+1 = %p\n", &arr[0]+1);
//
//
// printf("arr = %p\n", arr);
// printf("arr+1 = %p\n", arr+1);
//
// printf("&arr = %p\n", &arr);
// printf("&ar+1r = %p\n", &arr+1);
// return 0;
//}
//
//
//int main()
//{
// int arr[10] = { 0 };
// int sz = sizeof(arr) / sizeof(arr[0]);
// int i = 0;
// //输入
// int* p = arr;
// for (i = 0; i < sz; i++)
// {
// scanf("%d", p++);
// }
// p = arr;
// //输出
// for (i = 0; i < sz; i++)
// {
// printf("%d ", *(p + i));
// }
// return 0;
//}
//
//int main()
//{
// int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
// int* p = arr;
// int i = 0;
// int sz = sizeof(arr) / sizeof(arr[0]);
// for (i = 0; i < sz; i++)
// {
// //printf("%d ", *(p + i));
// //printf("%d ", *(arr + i));
// //printf("%d ", arr[i]);
//
// //printf("%d ", p[i]);
// printf("%d ", *(i + arr));
//
// //arr[i] == *(arr+i)
// //*(p+i) == p[i]
//
// //arr[i] == *(arr+i) == *(i+arr) == i[arr]
// // //不推荐这种写法
// //printf("%d ", i[arr]);
// }
// return 0;
//}
//
//
//
//int main()
//{
// int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
// int* p = arr;
// int i = 0;
// int sz = sizeof(arr) / sizeof(arr[0]);
// for (i = 0; i < sz; i++)
// {
// printf("%p ============= %p\n", p + i, &arr[i]);
// }
// return 0;
//}
//
//
//
//void print(int str[])
//{
// int i = 0;
// int sz = sizeof(str) / sizeof(str[0]);//得不到数组元素的个数
// for (i = 0; i < sz; i++)
// {
// printf("%d ", str[i]);
// }
//}
//int main()
//{
//
// int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
//
// print(arr);//打印arr数组的内容
// //arr就是数组首元素的地址
// return 0;
//}
//
//
//
//
//void print(int* p)
//{
// // 4 4
// int sz = sizeof(p) / sizeof(p);
//}
//int main()
//{
//
// int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
// print(arr);//打印arr数组的内容
// //arr就是数组首元素的地址
// return 0;
//}
//
//
//void print(int str[],int sz)
//{
// int i = 0;
// //int sz = sizeof(str) / sizeof(str[0]);//得不到数组元素的个数
// for (i = 0; i < sz; i++)
// {
// printf("%d ", str[i]);
// }
//}
//int main()
//{
//
// int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
// int sz = sizeof(arr) / sizeof(arr[0]);
// print(arr,sz);//打印arr数组的内容
// //arr就是数组首元素的地址
// return 0;
//}
//
//
//
//冒泡排序
//核心思想:两两相邻的数字进行比较
//
//void sort(int str[], int sz)
//{
// int i = 0;
// for (i = 0; i < sz-1; i++)
// {
// //一趟冒泡排序
// int flag = 1;//假设数组是有序的
// int j = 0;
// for (j = 0; j < sz-1 -i; j++)
// {
// //升序
// if (*(str+j) > str[j + 1])
// {
// //交换
// int tmp = str[j];
// str[j] = str[j+1];
// str[j+1] = tmp;
// flag = 0;//不是有序的
// }
// }
// if (flag == 1)//是有序的,直接跳出循环
// {
// break;
// }
// }
//
//}
//
//void print(int* str, int sz)
//{
// int i = 0;
// for (i = 0; i < sz; i++)
// {
// printf("%d ", *str);
// str++;
// }
//}
//
//int main()
//{
// //int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
// int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
// int sz = sizeof(arr) / sizeof(arr[0]);
// sort(arr,sz);
// print(arr, sz);
// return 0;
//}
//
//
//#include <stdio.h>
//
//int Count(int* str[], int sz)
//{
// int i = 0;
// for (i = 0; i < sz; i++)
// {
// printf("%d ", *(str + i));
// }
//}
//int main()
//{
// int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
// int sz = sizeof(arr) / sizeof(arr[0]);
// Count(arr, sz);
// return 0;
//}
//
//
//void Count(int* arr[],int sz)
//{
// int i = 0;
// for (i = 0; i < sz - 1; i++)
// {
// //假设是升序
// int flag = 1;
// //一趟冒泡排序
// int j = 0;
// for (j = 0; j < sz - 1 - i; j++)
// {
// if (arr[j] > arr[j + 1])
// {
// int tmp = arr[j+1];
// arr[j + 1] = arr[j];
// arr[j] = tmp;
// flag = 0;
// }
// }
// if (flag == 1)
// {
// break;
// }
// }
//}
//
//void print(int* str,int sz)
//{
// int i = 0;
// for (i = 0; i < sz; i++)
// {
// printf("%d ", *str);
// str++;
// }
//}
//
//int main()
//{
// int arr[10] = { 10,9,8,7,6,5,4,3,2,1 };
// int sz = sizeof(arr) / sizeof(arr[0]);
// Count(arr, sz);
// print(arr, sz);
// return 0;
//}
//
//
//void Count(int arr[], int sz)
//{
// int i = 0;
// for (i = 0; i < sz; i++)
// {
// //奇数
// if (arr[i] % 2 == 0)
// {
// int j = 0;
// for (j = i+1; j < sz; j++)
// {
// if (arr[j]%2==1)
// {
// //交换顺序
// int tmp = arr[i];
// arr[i] = arr[j];
// arr[j] = tmp;
// }
// }
// }
// }
//}
//
//void print(int* str, int sz)
//{
// int i = 0;
// for (i = 0; i < sz; i++)
// {
// printf("%d ", *str);
// str++;
// }
//}
//
//int main()
//{
// int arr[10] = { 10,9,8,7,6,5,4,3,2,1 };
// int sz = sizeof(arr) / sizeof(arr[0]);
// Count(arr, sz);
// print(arr, sz);
// return 0;
//}
//
//int main()
//{
// int a = 10;
// int* p = &a;
// //a是整型变量,占用4个字节的空间,a是有自己的地址,&a就是拿到的就是a所占4个字节的第一个字节的地址
// //p是指针变量,占用4/8个字节空间,p也是有自己的地址,&p就是拿到了p的地址
//
// int** pp = &p;
// //pp是指针变量,pp是二级指针变量
//
// int*** ppp = &pp;
// //ppp也是指针变量,ppp是三级指针变量
//
// return 0;
//}
//
//
//指针数组:存放指针的数组
//
//
//int main()
//{
// int a = 10;
// int b = 20;
// int c = 30;
// int* p[] = { &a,&b,&c };
// int i = 0;
// for (i = 0; i < 3; i++)
// {
// printf("%d ", *(p[i]));
// }
// return 0;
//}
//
//
//
//int main()
//{
// int arr1[] = { 1,2,3,4,5 };
// int arr2[] = { 2,3,4,5,6 };
// int arr3[] = { 3,4,5,6,7 };
//
// int* p[] = { arr1,arr2,arr3 };
//
// int i = 0;
// for (i = 0; i < 3; i++)
// {
// int j = 0;
// for (j = 0; j < 5; j++)
// {
// //printf("%d ", p[i][j]);
// //p[i] == *(p+i)
// printf("%d ", *(*(p + i) + j));
// //p[i][j] == *(*(p + i) + j)
// }
// printf("\n");
// }
// return 0;
//}
C语言指针-2
小扬扬大梦想2023-08-31 21:21