更改c指针值的正确方法

2023-12-28

抱歉,另一个 C 指针问题..我有一个函数 func() 对数组进行排序,然后获取最大和最小整数。我试图将它们放入 main() 中的指针变量中,但这些值仅在 func() 函数中正确。我不明白为什么:(

#include <stdio.h>

void func(int arr[], int *s, int *l, int n){
    int i = 1;
    for(; i < n; i++){
        int temp = arr[i];
        int n = i;
        while( n > 0 && arr[n-1] > temp){
            arr[n] = arr[n-1];
            n--;
        }
        arr[n] = temp;
    }
    l = &arr[n-1];
    s = &arr[0];\
    printf("%d %d\n",*l,*s);
}

int main(void){
    int arr[] = {1,2,9,3,58,21,4};
    int *s, *l;
    int size = 7;
    func(arr,s,l,size);
    printf("%d %d\n",*l,*s);
} 

当您将指针作为参数传递给 C 中的函数时,copy的指针已完成。因此,更改指针的值在该函数之外没有任何影响。但是,改变内存中的值引用者指针将在任何地方生效,如你所愿。对于您的情况,您需要执行以下操作:

void func(int arr[], int *s, int *l, int n){
    // sorting code..
    // l = &arr[n-1]; WRONG - these change the value of the pointer,
    //s = &arr[0];\   without changing the value of the memory they reference

    *l = arr[n-1]; // CORRECT - changes the value at the referenced memory
    *s = arr[0];
    printf("%d %d\n",*l,*s);
}

当然,您使用指针的方式main也是不正确的;它们未初始化,可能会导致分段错误。由于似乎没有理由使用实际的int*变数超常int那里的变量,我们可以采取另一种方法“通过引用”传递它们:

int main(void){
    int arr[] = {1,2,9,3,58,21,4};
    // int *s, *l; WRONG - we don't need pointers, we need to pass regular ints
    int s, l;
    int size = 7;
    // Get the address of our variables with the address-of (&) operator
    // This effectively creates int* variables out of our int variables
    func(arr, &s, &l,size);
    printf("%d %d\n",*l,*s);
} 

请注意,此处的术语“通过引用”在该短语的真正意义上并不正确,因为您仍然收到copy与变量关联的地址。大多数语言通过消除这种区别并只允许访问变量及其值来提供真正的引用功能,而复制在程序员的视线之外。您可以将其视为“通过参考l and s inside main”,从某种意义上说,它们的值可能会因被调用的函数而改变。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更改c指针值的正确方法 的相关文章

随机推荐

  • 使用 Spring 4 WebSocket 从 Java 推送消息

    我想将消息从 Java 推送到 WebSocket 客户端 我已经成功地让一个 js 客户端发送到服务器并在 2 个 js 客户端上接收返回的消息 因此客户端代码工作正常 我的问题是 我想在 Java 应用程序中发生事件时启动发送 例如 每
  • Google Apps 脚本:在电子表格之间移动数据

    我正在尝试使用 Google Apps 脚本在两个 Google 电子表格之间移动数据 名为 Ex ID 的电子表格为每个员工提供一张表和一行 每行有六个重要值 包括一个 ID 号和五个数据值 名为 CR ID 的电子表格为每个员工都有一个
  • 如何使用 Trello.NET 从 Trello 获取所有图板?

    这是我的代码 ITrello trello new Trello MyAppToken trello Authorize MyUserToken Member me trello Members Me var cards trello Ca
  • 为什么此 SVG 图形在 IE9 和 10(预览版)中无法缩放?

    根据IE网站 http msdn microsoft com en us ie hh410107 aspx支持 SVG 也根据这个答案什么是支持 SVG 可缩放矢量图形 的浏览器 https stackoverflow com questi
  • 在C++中,函数返回类型后面的&是什么意思?

    在这样的 C 函数中 int getNumber 什么是 意思是 它不同于 int getNumber 这不一样 int g test 0 int getNumberReference return g test int getNumber
  • 在 if 块内使用 wait 时,“await”对此表达式的类型没有影响

    在我的代码中 我有一个用户名数组 我试图遍历每个名 称 检查该用户是否存在于数据库中并创建用户 问题是 我的 linter 说 await has no effect on the type of this expression在我标记的地
  • 处理空参数的存储过程

    我确信这有一个非常简单的答案 我没有找到 我在数据库中有一个简单的层次结构 其中每一行都有一个 ParentId 如果ParentId IS NULL 那么它就是一个根元素 我有存储过程 CREATE PROCEDURE GetByPare
  • 使用 JSch 将文件从一台远程服务器发送到另一台使用 JSch 的服务器

    我想将文件从我的第一个远程服务器发送到另一个远程服务器 public boolean uploadFile throws JSchException SftpException ChannelSftp channelSftpA create
  • 从 C++ 调用 Swift 函数

    我想知道是否可以从 C 调用 Swift 函数 如果是 怎么办 我知道我们可以从 Swift 调用 C 函数 但我还没有找到确切的答案 虽然没有直接从 C 调用 Swift 函数的官方方法 但您可以设置一个可从 C 调用的函数指针 这是否有
  • 使用 Qt 判断 PC 是否退出待机状态

    有没有一种跨平台的方法 使用 Qt 来判断计算机是否已退出待机或休眠状态 我需要能够检测计算机何时退出待机状态 以便重置 继续进程 在本例中 它是通过串行端口连接到 GPS 基于以下讨论http comments gmane org gma
  • 共享快捷方式/图标

    我有几个带有共享文件的 inno 设置 使用 Sharedfile 标志可以确保它们仅在不再使用时才被卸载 然而 这不适用于快捷方式或图标 因为它们在 inno 中被调用并指向这些文件 即使目标文件没有被卸载 快捷方式也总是被删除 那么我缺
  • 我可以以这样的方式加载 dll,以便在加载时可以将其删除吗?

    标题基本概括了所有内容 我想做的是编写一个工具来监视包含插件的 dll 文件 当我覆盖它时 通过重新编译 它应该自动重新加载它 我知道我可以制作副本 加载副本并监视原始文件 但我认为可能有更好的方法 如果我理解正确的话 dll 已完全加载到
  • 如何为 Hexo 实现选项卡式代码块标签

    我正在尝试在 hexo 中创建选项卡式代码块 作为标签插件 但我不知道在哪里放置我的 js 函数 我想我可以使用加载该函数js 助手 https hexo io api helper html但我不知道在哪里包含助手 我尝试将其添加到标签插
  • 如何在android中的操作栏中设置应用程序图标

    我想在我的操作栏上设置我的应用程序图标请帮助我 我已经尝试过 但没有创建任何内容 getSupportActionBar setTitle MukilFM getSupportActionBar setIcon R drawable fm
  • 如何在 Visual Studio for Mac 中启用迁移

    我有 Visual Studio for Mac 我正在尝试使用以下教程来学习 Xamarin 和 Azure https adrianhall github io develop mobile apps with csharp and a
  • 如何通过矩阵索引值检索矩阵列和行名称?

    假设我有一个矩阵 mdat 并且我只知道索引号 如何检索列名和行名 例如 gt mdat lt matrix c 1 2 3 11 12 13 nrow 2 ncol 3 byrow TRUE dimnames list c row1 ro
  • 如何从 Wicket 1.5 中的 RequestCycle 获取responsePage?

    在 Wicket 1 4 中我使用了我自己的WebRequestCycle在分离时将页面存储在会话中 以实现 后退 链接 getRequestCycleListeners add new AbstractRequestCycleListen
  • 在 java 中读取 Excel 工作表的更好的 API - JXL 或 Apache POI [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 2 个 API 中哪一个更容易读取 写入 编辑 Excel 工作表 这些 API 不支持 CSV 扩展吗 对 file xls 和 file x
  • 3D 绘图中的图像叠加

    我有一个由 matplotlib 生成的 3D 线条图 我想在特定的 xy 或 yz xz 切片上叠加图像 我如何使用 python 来做到这一点 谢谢 我有一个简单的 3d 绘图代码 fig plt figure 1 br ax Axes
  • 更改c指针值的正确方法

    抱歉 另一个 C 指针问题 我有一个函数 func 对数组进行排序 然后获取最大和最小整数 我试图将它们放入 main 中的指针变量中 但这些值仅在 func 函数中正确 我不明白为什么 include