魔法指针 之 assert断言 传址调用 传值调用

简介: 魔法指针 之 assert断言 传址调用 传值调用

assert断言


概念

assert介绍

请看下段代码

#include<stdio.h>
#include<assert.h>
 
int main()
{
  int a = 10;
  int* p = &a;
  //...(此段代码省略处)
  //...(此段代码省略处)
  p = NULL;
  assert(p != NULL);
 
  return 0;
}

代码解释

#define NDEBUG的使用

如这段代码觉得没问题,

在调试结束后,可以通过在包含 #include 的语句之前插入 #define NDEBUG禁用 assert 调用

注意事项

1.assert是宏,需要定义头文件

2.assert只在DEBUG下生效,调试结束后,可以通过在#include<assert.h>语句之前插入#define DEBUG来禁用assert调用

3.assert作用是先计算表达式(expression),然后判断

判断:

表达式为真,继续执行后面程序

表达式为假,vs会报错,具体到哪行


传值调用 VS 传址调用


传值调用

传的是

举个栗子:

加法函数

看下面代码

int Add(int x, int y)
{
  return x + y;
}
 
int main()
{
  int a = 0, b = 0;
  scanf("%d %d", &a, &b);
  int ret = Add(a, b);
  printf("%d\n", ret);
}

以上代码用传值调用解释:

在主函数传a,b两个值并调用Add函数;

控制台显示:

传址调用

传的是地址

举个栗子:

strlen函数模拟实现

看下面代码

#include<stdio.h>
#include<string.h>
#include<assert.h>
size_t my_strlen(char* s)
{
  size_t count = 0;
  assert(s != NULL);
  while (*s)
  {
    count++;
    s++;
  }
  return count;
}
 
int main()
{
  char arr[] = "abcdef";
  size_t len = my_strlen(arr);
  printf("%zd\n", len);
  return 0;
}

控制台输出:6

代码解释:

此段代码想用strlen实现计算字符串的类型的个数

1.%zd是打印类型的

2.size_t 对应 unsigned int

3.再随着看上面👆assert断言的 注意事项就能理解这段代码了

用传址调用解释此代码:


区别

传值调用 传址调用
传的是 地址
在什么情况下使用? 函数调用某个数来计算 修改主调函数变量的值

请看下面两段代码:

写一个函数,交换两个整型变量的值

①段代码
#include<stdio.h>
int swap1(int x, int y)
{
  int z = 0;
  z = x;
  x = y;
  y = z;
}
 
int main()
{
  int a = 0, b = 0;
  scanf("%d %d", &a, &b);
  printf("交换前:a=%d,b=%d\n", a, b);
  swap1(a, b);
  printf("交换后:a=%d,b=%d\n", a, b);
  return 0;
}

代码解释:

涉及到函数的有关知识:

函数的实参传给形参,实参是形参的一份临时拷贝

形参是一个独立的空间,形参的修改并不会影响实参

②段代码
#include<stdio.h>
int swap2(int *pa, int *pb)
{
  int z = 0;
  z = *pa;
  *pa = *pb;
  *pb = z;
}
 
int main()
{
  int a = 0, 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;
}

②段代码注意事项

1.传址调用,传的是地址,在调用函数里要写“ & ”;

2.该代码涉及到解引用操作

目录
相关文章
|
5月前
|
安全 C语言
【C语言】:野指针和assert断言
【C语言】:野指针和assert断言
32 0
|
6月前
|
安全 程序员 编译器
了解野指针与assert断言 拿捏指针的使用!
了解野指针与assert断言 拿捏指针的使用!
|
6月前
|
安全 程序员 编译器
[C语言]指针进阶之野指针与assert断言
[C语言]指针进阶之野指针与assert断言
|
6月前
|
算法 编译器 C语言
C语言assert断言详解指针(3)
C语言assert断言详解指针(3)
|
6月前
|
存储 安全 编译器
指针详解(内含assert断言、冒泡排序、多级指针、qsort函数的使用等等)
电脑运行是需要内存的,通俗来讲内存就相当于一个宿舍楼。电脑运行过程中,内存空间如何进行管理?电脑运行时会将内存划分为一个个房间即内存单元,每个内存单元的大小为一个字节
|
程序员 C语言
assert断言与const修饰指针的妙用(模拟实现strcpy函数)
assert断言与const修饰指针的妙用(模拟实现strcpy函数)
|
C++
【C/C++学院】0816-引用包装器/仿函数/转义字符 R”()”/using别名/模板元编程 比递归优化/智能指针/多线程/静态断言以及调试技能的要求 assert
<p></p> <h2> <span style="font-family:宋体; font-size:16pt">引用包装器</span><span style="font-family:宋体; font-size:16pt">  std::ref(<span style="font-family:宋体">变量</span><span style="font-family:Cambri
1311 0
|
1月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
22 0
|
2月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。