1.const修饰变量
变量是可以修改的,如果将变量的地址传给一个指针变量,可以通过指针变量来改变这个变量的值,如果我们不想这个变量的值不能被随意更改,我们就可以使用const来修饰这个变量。
int main()
{
int n = 10;//n是变量
n = 5;
printf("%d\n", n);
return 0;
}
我们可以看到n的值已经成功被修改为5
int main()
{
const int n = 18;//n是变量
n = 0;
printf("%d\n", n);
}
我们可以看到通过const修饰的变量n不能再修改值,编译器会报错
注意:const修饰的变量n虽然不能被修改了,但本质上n仍然是一个变量
2.const修饰指针变量
int main()
{
const int n = 5;
const int* p = &n;
//int const* p = &n;
//*p = 10;//err
int m = 10;
p = &m;
}
由上面两张图片可以看到const修饰指针变量放在*左边共有两种情况而且两种形式是等效的,
const 修饰指针变量有两种情况
//
//1.const 放在* 的左边:限制的是*p意思是不能通过p来改变p指向对象的内容,但是p本身是可以改变的,p可以指向其他对象
// const int* p = &n; int const* p = &n;
2.const 放在*的右边:限制的是p,意思是不能修改p本身的内容,但是p指向的内容是可以通过p来改变的
//int * const p = &i;
由上面两张图片我们可以看到当const修饰指针变量放在*的右边时,指针变量i 可以改变其值,但是变量j不能通过指针来修改它的值
3. assert断言
assert宏又常常被称为断言,用于⽤于在运⾏时确保程序符合指定条件,如果不符合,就报 错终⽌运⾏,它的头文件为assert.h.运用方法为assert(表达式)。
int main()
{
int a = 10;
int* p = NULL;
assert(p != NULL);
*p = 20;
printf("%d\n", a);
return 0;
}
int main()
{
int a = 10;
int* p = &a;
assert(p != NULL);
*p = 20;
printf("%d\n", a);
return 0;
}
在上述代码中当程序执行 assert(p != NULL) 语句时,首先判断p的值是不是一个空值0,如果变量p为NULL那么程序就会报错并终止 ,在屏幕上打印显示没有通过的代码以及包含这个语句文件名和行号,如果p确实不为NULL,assert()不会产生任何效果,继续执行下面的代码。如上述代码就会执行*p = 20;的语句并在屏幕上打印a的值20。
4. 传值调用和传址调用
1).传值调用
void Swap1(int a, int b)
{
int z = 0;
z = a;
a = b;
b = z;
}
int main()
{
int a = 10;
int b = 20;
printf("交换前:a = %d b = %d\n", a, b);
Swap1(a, b);
printf("交换后:a = %d b = %d\n", a, b);
return 0;
}
我们可以看到形参x,y的值在Swap函数内没有发生改变
2).传址 调用
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void Swap(int* pa, int* pb)
{
int z = 0;
z = *pa; //z = a;
*pa = *pb; //a = b;
*pb = z; //b = 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;
}
当实参传递给形参时,形参也是有自己独立的空间的,形参是实参的一份临时拷贝,对形参的修改不会影响实参。
传址调用可以让函数与主调函数之间建立真正的联系,在函数内部可以修改主调函数中的变量。所以如果函数只是需要主调函数中的变量值来计算就可以采用传值调用,如果函数内部需要修改主调函数中变量的值就需要传址调用。
标签:main,const,语言,int,assert,深入,printf,指针,变量 From: https://blog.csdn.net/2302_80892233/article/details/136613636