C Pointer and Address Supporting tagline
Reference
Programming Language Pragmatics
chapter 7.7
C++ 反汇编和逆向分析技术揭秘
chapter 8
区别
指针是一个高级概念,是对于对象的引用;
地址是一个低级概念,是内存单元的位置。
联系
指针通常通过地址实现,但不总是这样。
在具有分段存储体系结构的机器上,指针可以由一个 段标识和一个段内偏移量组成.
在那些试图捕捉所有悬空引用的语言中, 指针可能包含一个地址和一个 access key
作为运算符的时候
int n;
int *a;
int b[10];
a = b; // 指向 b 的第一个元素
n = b[1];
n = *(b+1);
[ ]
运算符其实是指针运算的语法糖. 所以 n = b[1]
, 是对于 n = *(b+1)
的包装
声明的时候
int *a; // 分配 一个指针类型的内存
int a[10]; // 分配 10 个 int 类型的内存
下标寻址和指针寻址
#include <stdio.h>
int main()
{
char * pChar = NULL;
char array[] = "Hello";
pChar = array;
printf("%c\n", *pChar);
printf("%c\n", array[0]);
}
gcc -S -O3 -fno-asynchronous-unwind-tables test.c
对应的汇编
.section __TEXT,__text,regular,pure_instructions
.globl _main
.align 4, 0x90
_main: ## @main
## BB#0:
pushq %rbp
movq %rsp, %rbp
pushq %rbx
pushq %rax
leaq L_.str(%rip), %rbx
movq %rbx, %rdi
movl $72, %esi
xorb %al, %al
callq _printf
movq %rbx, %rdi
movl $72, %esi
xorb %al, %al
callq _printf
xorl %eax, %eax
addq $8, %rsp
popq %rbx
popq %rbp
ret
.section __TEXT,__cstring,cstring_literals
L_.str: ## @.str
.asciz "%c\n"
.subsections_via_symbols
太血腥了, 在 O3 优化后, 他居然直接用 H 的 ascii 码值代替了寻址.
此处不能优化
.section __TEXT,__text,regular,pure_instructions
.globl _main
.align 4, 0x90
_main: ## @main
## BB#0:
pushq %rbp
movq %rsp, %rbp
subq $32, %rsp
movq $0, -8(%rbp)
movl L_main.array(%rip), %eax
movl %eax, -14(%rbp)
movw L_main.array+4(%rip), %cx
movw %cx, -10(%rbp)
leaq L_.str(%rip), %rdi
leaq -14(%rbp), %rdx
movq %rdx, -8(%rbp)
movq -8(%rbp), %rdx
movsbl (%rdx), %esi
movb $0, %al
callq _printf
leaq L_.str(%rip), %rdi
movsbl -14(%rbp), %esi
movl %eax, -20(%rbp) ## 4-byte Spill
movb $0, %al
callq _printf
movl $0, %esi
movl %eax, -24(%rbp) ## 4-byte Spill
movl %esi, %eax
addq $32, %rsp
popq %rbp
ret
.section __TEXT,__cstring,cstring_literals
L_main.array: ## @main.array
.asciz "Hello"
L_.str: ## @.str
.asciz "%c\n"
.subsections_via_symbols
Published
27 October 2013