- #include
- int main()
- {
- int m = 0;
- m = 20;//m是可以修改的
- const int n = 0;
- n = 20;//n是不能被修改的
- printf("%d\n",n);
-
- return 0;
- }
编译结果:

- #include
- int main()
- {
- const int n = 0;
- printf("n = %d\n", n);
- int*p = &n;
- *p = 20;
- printf("n = %d\n", n);
-
- return 0;
- }
运行结果:

- int * p;//没有const修饰
- int const * p;//const 放在*的左边做修饰
- int * const p;//const 放在*的右边做修饰
- #include
- //代码1 - 测试⽆const修饰的情况
- int main()
- {
- int n = 10;
- int m = 20;
- int* p = &n;
- *p = 20;//ok?
- printf("n = %d\n", n);
- p = &m; //ok?
- *p = 30;
- printf("m = %d\n", m);
-
- return 0;
- }
运行结果:

- #include
- //代码2 - 测试const放在*的左边情况
- int main()
- {
- int n = 10;
- int m = 20;
- const int* p = &n;
- *p = 20;//ok?
- p = &m; //ok?
-
- return 0;
- }
- #include
- //代码3 - 测试const放在*的右边情况
- int main()
- {
- int n = 10;
- int m = 20;
- int* const p = &n;
- *p = 20; //ok?
- p = &m; //ok?
-
- return 0;
- }
调试结果:
- #include
- //代码4 - 测试*的左右两边都有const
- int main()
- {
- int n = 10;
- int m = 20;
- int const* const p = &n;
- *p = 20; //ok?
- p = &m; //ok?
-
- return 0;
- }
调试结果:

int arr[10] = {1,2,3,4,5,6,7,8,9,10};

- #include
- //指针+- 整数
- int main()
- {
- int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
- int* p = &arr[0];
- int i = 0;
- int sz = sizeof(arr) / sizeof(arr[0]);
- for (i = 0; i < sz; i++)
- {
- printf("%d ", *(p + i));//p+i 这⾥就是指针+整数
- }
-
- return 0;
- }
运行结果:

- //指针-指针
- #include
- int my_strlen(char* s)//这里char* s是用来接收arr数组的首地址&arr[0]
- {
- char* p = s;
- while (*p != '\0')
- p++;
- return p - s;
- }
- int main()
- {
- char arr[10] = "abcdef";
- int len = my_strlen(arr);
- printf("%d\n", len);
-
- return 0;
- }
运行结果:

通过上述代码,我们可以知道指针-指针的计算可以计算出俩指针之间的元素个数。通过这种方式我们就可以计算出整个数组中的元素个数。
再比如我们写一个简单点的代码:
- #include
-
- int main()
- {
- char arr[10] = "abcdef";
- char* p1 = &arr[0];
- char* p2 = &arr[3];
- int num = p2 - p1;
- printf("%d\n", num);
-
- return 0;
- }
运行结果:

- //指针的关系运算
- #include
- int main()
- {
- int arr[10] = {1,2,3,4,5,6,7,8,9,10};
- int *p = &arr[0];
- int sz = sizeof(arr)/sizeof(arr[0]);
- while(p
//指针的⼤⼩⽐较 - {
- printf("%d ", *p);
- p++;
- }
- return 0;
- }
运行结果:

- #include
- int main()
- {
- int *p;//局部变量指针未初始化,默认为随机值
- *p = 20;
- return 0;
- }
- #include
- int main()
- {
- int arr[10] = {0};
- int *p = &arr[0];
- int i = 0;
- for(i=0; i<=11; i++)
- {
- //当指针指向的范围超出数组arr的范围时,p就是野指针
- *(p++) = i;
- }
- return 0;
- }
- #include
- int test()
- {
- int n = 100;
- return &n;
- }
- //出了函数,n的地址就销毁了
- int main()
- {
- int* p = test();//能得到原先的n地址,但可能不是原来 n = 100的值
- printf("%d\n", *p);
-
- return 0;
- }
- #ifdef __cplusplus
- #define NULL 0
- #else
- #define NULL ((void *)0)
- #endif
- #include
- int main()
- {
- int num = 10;
- int*p1 = #
- int*p2 = NULL;
-
- return 0;
- }
- int main()
- {
- int arr[10] = {1,2,3,4,5,6,7,8,9,10};
- int* p = &arr[0];
- for(i=0; i<10; i++)
- {
- *(p++) = i;
- }
- //此时p已经越界了,可以把p置为NULL
- p = NULL;
- //下次使⽤的时候,判断p不为NULL的时候再使⽤
- //...
- p = &arr[0];//重新让p获得地址
- if(p != NULL) //判断
- {
- //...
- }
- return 0;
- }
assert(p != NULL);
- #include
- #include
-
- int main()
- {
- int a = 10;
- int* p = NULL;
- assert(p != NULL);//不满足条件,程序不往下执行
- p = &a;
- *p = 20;
- printf("%d\n", a);
-
- return 0;
- }
运行结果:

- #define NDEBUG
- #include
- #define NDEBUG
-
- #include
- #include
-
- int main()
- {
- int a = 10;
- int* p = NULL;
- assert(p != NULL);//不满足条件,程序不往下执行
- p = &a;
- *p = 20;
- printf("%d\n", a);
-
- return 0;
- }
运行结果:

size_t strlen ( const char * str );
- #define NDEBUG
- #include
- #include
-
- int my_strlen(const char * str)
- {
- int count = 0;
- assert(str);
- while(*str)
- {
- count++;
- str++;
- }
- return count;
- }
- int main()
- {
- int len = my_strlen("abcdef");
- printf("%d\n", len);
- return 0;
- }
运行结果:


- #include
- void Swap2(int* px, int* py)
- {
- int tmp = 0;
- tmp = *px;
- *px = *py;
- *py = tmp;
- }
- int main()
- {
- int a = 0;
- int b = 0;
- scanf("%d %d", &a, &b);
- printf("交换前:a=%d b=%d\n", a, b);
- Swap2(&a, &b);
- printf("交换后:a=%d b=%d\n", a, b);
- return 0;
- }