C 语言指针 引用学习

举个实例

 1 #include<stdio.h>
 2 int test_num;
 3 void func(int *p)
 4 {
 5     p = &test_num;
 6 }
 7 int main(void)
 8 {
 9     int *p;
10     func(p);
11     *p = 1000;
12     return 0;
13 }

运行出core

反汇编:

gcc -S t3.c -o t3.s
    .file    "t3.c"
    .comm    test_num,4,4
    .text
    .globl    func
    .type    func, @function
func:
.LFB0:
    .cfi_startproc
    pushq    %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movq    %rdi, -24(%rbp)
    movq    $test_num, -8(%rbp)
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size    func, .-func
    .globl    main
    .type    main, @function
main:
.LFB1:
    .cfi_startproc
    pushq    %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    subq    $16, %rsp
    movq    -8(%rbp), %rax
    movq    %rax, %rdi
    call    func
    movq    -8(%rbp), %rax
    movl    $1000, (%rax)
    movl    $0, %eax
    leave
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE1:
    .size    main, .-main
    .ident    "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8.4"
    .section    .note.GNU-stack,"",@progbits

main函数在call func之前:


    movq    -8(%rbp), %rax
    movl    $1000, (%rax)

明显的错误,把ebp的下4字节的内容移动到当前esp所指向的内容,实际上做了一个*p的副本,为func函数使用;
调用func函数后:
  movq $test_num, -8(%rbp)
于是,func函数操作的只是*p的副本,把副本里存放了a的首地址。
ret回main函数后,变量a赋值为100,main函数里的*p,是不知道的,因为,只有它的副本知道。

更改源码:

 1 #include<stdio.h>
 2 int test_num;
 3 void func(int **p)
 4 {
 5     *p = &test_num;
 6 }
 7 int main(void)
 8 {
 9     int *p;
10     func(&p);
11     *p = 1000;
12     return 0;
13 }

反汇编处理:

 1     .file    "t3.c"
 2     .comm    test_num,4,4
 3     .text
 4     .globl    func
 5     .type    func, @function
 6 func:
 7 .LFB0:
 8     .cfi_startproc
 9     pushq    %rbp
10     .cfi_def_cfa_offset 16
11     .cfi_offset 6, -16
12     movq    %rsp, %rbp
13     .cfi_def_cfa_register 6
14     movq    %rdi, -8(%rbp)
15     movq    -8(%rbp), %rax
16     movq    $test_num, (%rax)
17     popq    %rbp
18     .cfi_def_cfa 7, 8
19     ret
20     .cfi_endproc
21 .LFE0:
22     .size    func, .-func
23     .globl    main
24     .type    main, @function
25 main:
26 .LFB1:
27     .cfi_startproc
28     pushq    %rbp
29     .cfi_def_cfa_offset 16
30     .cfi_offset 6, -16
31     movq    %rsp, %rbp
32     .cfi_def_cfa_register 6
33     subq    $16, %rsp
34     leaq    -8(%rbp), %rax
35     movq    %rax, %rdi
36     call    func
37     movq    -8(%rbp), %rax
38     movl    $1000, (%rax)
39     movl    $0, %eax
40     leave
41     .cfi_def_cfa 7, 8
42     ret
43     .cfi_endproc
44 .LFE1:
45     .size    main, .-main
46     .ident    "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8.4"
47     .section    .note.GNU-stack,"",@progbits

可以看到有发生变化

也就是说,作为副本供func函数使用的不是ebp下4个字节的内容,而是内容里所指向的地址(即mian函数*p的地址)。

原文地址:https://www.cnblogs.com/mysky007/p/11257273.html

时间: 2024-11-13 08:11:53

C 语言指针 引用学习的相关文章

黑马程序员-c语言指针的学习

c语言的难点和精华部分就是指针,能够将指针完全理解并且将其运用熟练不是一件容易的事情,其中有几个知识点比较绕一些. 1.数组指针与指针数组的区别.  数组指针是一个指针,是指向数组的指针,就如同int*,char*型指针,只不过它是指向数组的(首元素),大小为4(32位平台下),通过它就可以做找到整个数组. 1 #include <stdio.h> 2 int main(int argc, char *argv[]) 3 { 4 int a[3][4] = {{0,1,2,4}, 5 {5,6

C语言 ---- 指针 iOS学习-----细碎知识点总结

内存的访问形式:1.直接访问:通过变量名进行访问.2.间接访问:先找到变量存放的地址,然后根据地址去访问对应的内存空间. 指针--- // 定义一个整形指针变量,用来存储num1在内存中的地址    int *p = NULL; // 定义一个整形指针变量,指向0x0,NULL恒等于0        printf("%p\n", p); // 输出指针变量的值,使用"%p"    printf("&num1 = %p\n", &n

C语言中关于指针的学习

指针是C语言中广泛使用的一种数据类型. 运用指针编程是C语言最主要的风格之一.利用指针变量可以表示各种数据结构: 能很方便地使用数组和字符串: 并能象汇编语言一样处理内存地址,从而编出精练而高效的程序.指针极大地丰富了C语言的功能. 学习指针是学习C语言中最重要的一环, 能否正确理解和使用指针是我们是否掌握C语言的一个标志.同时, 指针也是C语言中最为困难的一部分,在学习中除了要正确理解基本概念,还必须要多编程,上机调试.只要作到这些,指针也是不难掌握的. 指针的基本概念 在计算机中,所有的数据

GO语言学习(十五)Go 语言指针

Go 语言指针 Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务. 接下来让我们来一步步学习 Go 语言指针. 我们都知道,变量是一种使用方便的占位符,用于引用计算机内存地址. Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址. 以下实例演示了变量在内存中地址: package main import "fmt" func main() { var a int = 10 fmt.Printf("变量的地址: %x\n

c语言指针学习

前言 近期俄罗斯的陨石.四月的血月.五月北京的飞雪以及天朝各种血腥和混乱,给人一种不详的预感.佛祖说的末法时期,五浊恶世 ,十恶之世,人再无心法约束,道德沦丧,和现在正好吻合.尤其是在天朝,空气,水,食品,你能告诉还有没有问题的吗?不知大难至,世人依旧忙.祸福相依,危中有机.那些高级生命,出于慈悲,会救渡我们,但是你要去思考,去发现机缘. 最近较闲,没事就学点基础知识,整天在上层晃,感觉晕的厉害,接地气.关于指针我上学的时候学过一点,我的老师说"指针很难呢",当时以为这老师挺谦虚的.后

【C语言学习】指针再学习(二)之数组的指针

★一维数组 一个整型数据为4个字节.4个字节就是32位,即可以表示2^32个数字 在程序中定义一个数组a[5] = {1,2,3,4,5}; 那么a[0]的地址就是0x00000000,数组名a是数组首元素的地址,a的地址也是0x00000000.a+1则表示的地址是0x00000004,而不是0x00000001.因为1这个值,根据前面的指针a所指向的类型的长度来调整自己的长度.也就是说如果a是指向整型的指针,那么后面加的1也表示4个字节,如果a是指向字符型的指针,那么后面加的1表示1个字节.

c语言指针学习[转]

前言 近期俄罗斯的陨石.四月的血月.五月北京的飞雪以及天朝各种血腥和混乱,给人一种不详的预感.佛祖说的末法时期,五浊恶世 ,十恶之世,人再无心法约束,道德沦丧,和现在正好吻合.尤其是在天朝,空气,水,食品,你能告诉还有没有问题的吗?不知大难至,世人依旧忙.祸福相依,危中有机.那些高级生命,出于慈悲,会救渡我们,但是你要去思考,去发现机缘. 最近较闲,没事就学点基础知识,整天在上层晃,感觉晕的厉害,接地气.关于指针我上学的时候学过一点,我的老师说"指针很难呢",当时以为这老师挺谦虚的.后

(转载)c语言指针学习

前言 近期俄罗斯的陨石.四月的血月.五月北京的飞雪以及天朝各种血腥和混乱,给人一种不详的预感.佛祖说的末法时期,五浊恶世 ,十恶之世,人再无心法约束,道德沦丧,和现在正好吻合.尤其是在天朝,空气,水,食品,你能告诉还有没有问题的吗?不知大难至,世人依旧忙.祸福相依,危中有机.那些高级生命,出于慈悲,会救渡我们,但是你要去思考,去发现机缘. 最近较闲,没事就学点基础知识,整天在上层晃,感觉晕的厉害,接地气.关于指针我上学的时候学过一点,我的老师说"指针很难呢",当时以为这老师挺谦虚的.后

C语言指针的深入理解

指针是C语言中广泛使用的一种数据类型.运用指针编程是C语言最主要的风格之一. 利用指针变量可以表示各种数据结构:能很方便地使用数组和字符串:并能象汇编语言一样处理内存地址,从而编出精练而高效的程序.指针极大地丰富了C语言的功能. 学习指针是学习C语言中最重要的一环,能否正确理解和使用指针是我们是否掌握C语言的一个标志. C语言为什么有指针以及指针有什么好处? 从大体上讲:指针是 C 语言区别于其他同时代高级语言的主要特征之一.其次因为数组或函数都是连续存放的.通过访问指针变量取得了数组或函数的首