//
// main.m
// C07 指针-1
//
// Created by 康亮亮 on 15/10/15.
// Copyright (c) 2015年 Darling.com. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
#pragma mark 一、指针变量
/*
指针:指针就是内存单元编号的另一种称呼。每个内存单元都有一个编号,这个编号就是内存单元的地址,也被称作指针。
指针变量: 用来保存“内存单元”地址的变量,就是指针变量。
*/
// 定义一个指针变量
int a = 12;
/* int * : 类型声明符,表示标量p是一个整形指针变量
int :告诉系统,在取值时,应该从当前位置连续取多少字节的数据。int表示连续取4个字节。
p:变量名,一般我们将指针类型的变量名取名叫p。
NULL : C语言中,使用NULL代替“空”的意思,将NULL赋给指针,则指针此时保存的是内存起始地址,指针指向内存起始位置。
/ 注意:指针变量所占字节数只与操作系统的位数有关!!!(64位环境下占8字节,32位环境下占4字节)*/
int *p = NULL;
printf("%lu\n", sizeof(p)); // %lu表示输出无符号长整型整数
// 使用%p作为占位符,来打印指针变量所保存的地址
printf("%p\n", p); // %p一般以十六进制整数方式输出指针的值;打印结果0x0,表示内存的起始位置
// 将整形变量a的地址,交给整形指针变量p保存
// & :取地址符号,将后边变量的地址取出来,交给指针保存
p = &a;
printf("%p\n", &a);
printf("%p\n", p);
// * :取值运算符,将指针所指向的内存地址中保存的数据取出来
// 注意:*在不同位置的含义不同,出现在指针定义的位置,表明声明后边的变量名是一个指针; 如果*前面没有类型修饰符,则表示取出指针所指向的地址的数值
int b = *p;
printf("a = %d\n", a);
printf("*p = %d\n", *p);
printf("b = %d\n", b);
// 使用指针修改变量a的值:*p访问到a得值,然后再修改
*p = 23;// a = 23;
printf("a = %d\n", a);
// 指针重指向
int c = 99;
p = &c; // 指针重指向,从指向a,变为指向c
printf("p = %p\n", p);
#pragma mark 指针的算术运算
p++; // 对指针变量进行加法操作,指针p所保存的地址将会加上若干个单位的字节数,每个单位占用的字节数取决于指针的类型。 指针从低地址向高地址挪动。
printf("p = %p\n", p);
p--; // 对指针变量进行减法操作,指针p所保存的地址将会减去若干个单位的字节数,每个单位占用的字节数取决于指针的类型。 指针从高地址向低地址挪动。
printf("p = %p\n", p);
// 普通的加减运算:如果没有小括号干扰优先级,则先取值,再将值进行加减运算操作
// 自增、自减运算:先处理自增、自减 ,处理完成后,再进行取值运算
int temp = * p++;
printf("temp = %d\n", temp);
printf("p = %p\n", p);
int temp1 = *p+3;
printf("temp1 = %d\n", temp1);
printf("p = %p\n", p);
int temp2 = *(p+3);
printf("temp2 = %d\n", temp2);
printf("p = %p\n", p);
return 0;
}