使用指针实现猜数游戏

本文详细介绍了C语言中的指针概念,包括指针定义、解引用、算术运算、空指针和野指针,以及指针与数组、函数和动态内存分配的关系。同时提及了如何使用rand()函数生成随机数,强调了正确处理指针以避免潜在问题的重要性。
摘要由CSDN通过智能技术生成

指针在C语言中是一个非常重要的概念,它允许我们直接操作内存地址。下面是一些关于C语言中指针的基础知识:

1. 指针的定义:

指针是一个变量,其值为另一个变量的地址。换句话说,指针指向另一个变量。

int a = 10;

int *p = &a; // p是一个指向int类型的指针,它指向变量a

 

2. 指针的解引用:

使用"*"运算符可以获取指针指向的值,这称为解引用。

int b = *p; // b的值现在是10,因为p指向a,a的值为10

 

3. 指针的算术运算:

指针可以进行加法和减法运算,结果是指针向前或向后移动了多少个元素(基于指针的类型)。

int arr[5] = {1, 2, 3, 4, 5};

int *p = &arr[0]; // p指向arr的第一个元素

p++; // p现在指向arr的第二个元素

 

4. 空指针:

一个指针如果不指向任何有效的内存地址,那么它就是一个空指针。在C语言中,"NULL"是一个宏定义,表示空指针。

int *p = NULL; //将p初始化为NULL,表示p指向空地址

 

5. 野指针:

野指针是指那些已经释放了内存,但是指针的值没有被置为"NULL",仍然指向原来的内存地址的指针。使用野指针可能会导致不可预测的行为。

 

6. 指针与数组:

在C语言中,数组名其实是一个指向数组第一个元素的指针。因此,使用数组名或指针来访问数组元素是等效的。

int arr[5] = {1, 2, 3, 4, 5};

int *p = arr; // p和arr有相同的地址,都指向arr的第一个元素

 

7. 指针与函数:

函数参数可以通过指针传递,这样函数可以修改调用者传递的实际变量的值。此外,函数也可以返回指针。

int *getPtr(int value) {

int temp = value;

return &temp; // 注意:这里返回的是局部变量的地址,这是不安全的

}

 

8. 指针与动态内存分配:

使用"malloc"、"calloc"和"realloc"函数可以在运行时动态地分配和重新分配内存。这些函数返回的是指向所分配内存的指针。

int *p = (int *)malloc(sizeof(int) * 5); // 分配一个可以存储5个int的数组

 

在使用指针时,务必注意以下几点:

 

① 避免野指针,当释放了内存后,确保将指针设置为"NULL"。

②在使用指针访问数组或内存时,确保不要越界。

③在函数内部,避免返回局部变量的地址,因为这可能导致未定义的行为。

 

下面我们来看一个实例:还是我们熟悉猜数游戏。

ee5d89cc2621443189f71e07b04484b8.png

 

今天这个例子有点陌生的应该就是那个随机生成函数,下面我们来讲讲这个随机生成函数。

在C语言中,"rand()" 函数是标准库中的一个函数,用于生成一个伪随机数。它的定义在

"<stdlib.h>"头文件中。

 

"rand()"函数返回一个介于 "0" 和 "RAND_MAX" 之间的整数。"RAND_MAX" 通常是一个非常大的数(例如在许多实现中为 "32767"),但是具体的值取决于系统和库的实现。

 

下面是一个简单的例子,展示了如何使用 "rand()"函数生成一个介于 "1" 和 "6" 之间的随机数,模拟一个六面骰子的投掷:

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

int main() {

// 使用当前时间作为随机数生成器的种子

srand(time(NULL));

 

// 生成一个1到6之间的随机数

int dice_roll = rand() % 6 + 1;

printf("你摇到的数字是%d!\n", dice_roll);

return 0;}

在这个例子中,我们首先使用 "srand()"函数来设置随机数生成器的种子。种子是随机数生成算法的起点,使用相同的种子会生成相同的随机数序列。为了每次运行程序时得到不同的随机数,我们使用 "time(NULL)" 函数,它返回当前时间(以秒为单位),作为种子。

然后,我们使用 "rand()"函数生成一个随机数,并使用模运算 "%`"和加法来将其限制在"1"到 "6" 的范围内。

好啦,今天的分享就到这里了。再次声明:作者水平有限,如有失偏颇,还请各位不吝赐教!

  • 17
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值