首页 > 其他分享 >c语言:深入了解指针(2)

c语言:深入了解指针(2)

时间:2024-03-14 19:59:26浏览次数:27  
标签:main const 语言 int assert 深入 printf 指针 变量

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

相关文章

  • [C语言]还原原版的扫雷
    今天看了b站鹏哥做的扫雷,其中有几点鹏哥没有进行优化,第一个就是没有在进行游戏前不布置雷,在选择第一个方块的时候再布置雷,还有就是如何像原版扫雷一样,点到一个周围为0的方块再检测其周围的方块的取值,鹏哥也暗示了可以用递归的方法,最后一点就是像原版一样进行标记选择,最后一点其......
  • C语言const 和 *的爱恨情仇
    相信所有在学C的人都对const和*这对小情侣非常熟悉,实在是太烦了。他们中间还时不时得加个第三者什么int,char啥的。看了很多资料再加上我自身的总结提炼理解以后,我终于把他们理清了。首先const这个关键字是用来修饰常量的,我们就简称它为常量。定义指针的时候都会用到*,int*p......
  • Go语言中的面向对象编程(OOP)
    在Go语言中,虽然没有像面向对象语言那样的类,但通过结构体类型和方法,仍然支持部分面向对象编程(OOP)的概念。封装(Encapsulation)封装是一种将一个对象的实现细节隐藏起来,使其对其他对象不可见的做法,这样可以实现解耦。例如,考虑以下结构体:typeStudentstruct{namestring......
  • Coursera自然语言处理专项课程01:Natural Language Processing with Classification an
    NaturalLanguageProcessingwithClassificationandVectorSpacesCourseCertificate本文是NaturalLanguageProcessingwithClassificationandVectorSpaces这门课的学习笔记,仅供个人学习使用,如有侵权,请联系删除。文章目录NaturalLanguageProcessingwi......
  • 实验1 c语言开发环境使用和数据类型、运算符、表达式
    task1`#include<stdio.h>intmain(){printf("o\n");printf("\n");printf("II\n");printf("o\n");printf("<H>\n");printf("II\n");return0;}``#include<stdio......
  • androidstudio不能选择java作为开发语言
    给我整笑了,。。。太久没用Androidstudio今天打开一堆错误,如:出现AppCompatActivity一直爆红问题,出现cannotresolvesymbolAppCompatActivity问题,出现Version28(intendedforAndroidPieandbelow)isthelastversionofthelegacysupportlibrary等问题,解决一个立马出现......
  • 实验1_C语言输入输出和简单程序编写
    task1_11#include<stdio.h>2#include<stdlib.h>3intmain()4{5printf("O\n");6printf("<H>\n");7printf("II\n");8printf("O\n");9printf("<H>\n");10p......
  • cpp:"函数指针"的方法
    目录仿函数类std::function类Lambda类lambda函数函数对象有这几类:仿函数类即重载operator()classFuncObjType{public:voidoperator()(){cout<<"HelloC++!"<<endl;}};std::function类即上文中func_typestd::function<float(float,float)>......
  • C++、Java 和 Go 是三种流行的编程语言,它们各有不同的特点和应用场景
    C++:面向对象和泛型编程:C++是一种多范式编程语言,支持面向对象编程(OOP)和泛型编程(GenericProgramming)。性能:C++是一种系统级编程语言,注重性能和内存管理。它提供了直接的内存访问和指针操作,使得程序员可以更精细地控制内存和计算资源。灵活性:C++允许程序员直接操作硬件,并提......
  • 深入了解与全面解析华为认证(HCIA/HCIP/HCIE)
    一、网络行业技术认证网络行业对于技术评定一般分为两种,一种是企业认证,一种是国家认证企业认证属于技术认证,在国内的互联网企业都会承认,用于评定一个人的技术等级或者企业招投标的资质。网络行业认证最好的有三种,又分别有三种不同等级及多种方向,分别为:华为、思科、H3C(华......