指针基本操作

//
//  main.c
//  指针基本操作
//
//  Created by zhangxueming on 15/6/3.
//  Copyright (c) 2015年 zhangxueming. All rights reserved.
//

#include <stdio.h>
//地址:
//变量定义在内存中, 也有自己的地址
//int a;
//通过&获取变量在内存中的位置

//int main(int argc, const char * argv[]) {
//    int a=100;
//    printf("%p
", &a);
//    return 0;
//}

//指针变量: 保存变量内存地址的工具
//本质是变量,保存其它变量的地址
//int *p = &a;
//数据类型(指针指向变量的数据类型) + *(指针变量说明符) + 变量名;

//int * 是指针变量的类型

//int main(int argc, const char *argv[])
//{
//    int a=100;
//    int *p = &a;
//    printf("%p
", &a);
//    printf("%p
", p);
//    
//    //指针变量也有自己地址
//    printf("%p
", &p);
//    
//    return 0;
//}

//间接寻址 *
//通过变量的地址寻址到对应地址的变量空间
//* & 是一对互逆运算符

//int main(int argc,const char *argv[])
//{
//    int a=100;
//    int *p = &a;
//    
//    printf("%p
", &a);
//    
//    printf("a= %d
", *p);
//    printf("a = %d
", *&a);
//    printf("a = %d
", a);
//    
//    return 0;
//}

//指针变量的大小
//只跟平台有关, 32位平台占4字节 64位平台占8字节

//int main(int argc,const char *argv[])
//{
//    printf("size = %lu
", sizeof(char *));
//    printf("size = %lu
", sizeof(int *));
//    printf("size = %lu
", sizeof(long *));
//    printf("size = %lu
", sizeof(double *));
//    return 0;
//}

//int main(int argc, const char *argv[])
//{
//    int a=100;
//    int *p= &a;
//    int *q= p;//指针变量可以直接给指针变量赋值
//    
//    *p = 200;
//    printf("a = %d
", *q);
//    *q = 300;
//    printf("a = %d
", *p);
//    
//    return 0;
//}

//泛型指针
//void *

//int main(int argc, const char *argv[])
//{
//    int a=100;
//    long b = 200;
//    float f=3.14;
//    
//    void *p = &a;
//    printf("a = %d
", *(int *)p);
//    p = &b;
//    printf("b = %ld
", *(long *)p);
//    p = &f;
//    printf("f = %f
", *(float *)p);
//    
//    return 0;
//}

//空指针
//NULL
//#define NULL  ((void *)0)

//野指针
//1. 定义了指针变量后没有给初值
//2. 指针变量指向的内存空间被释放
#include <stdlib.h>

//int main(int argc,const char *argv[])
//{
//    char *p=NULL;
//    //1.申请内存
//    p = (char *)malloc(100);
//    //2.判断内存是否申请成功
//    if(!p)
//    {
//        return -1;
//    }
//    //3.使用内存
//    scanf("%s", p);
//    printf("%s
", p);
//    //4.释放内存
//    free(p);
//    //5.
//    p = NULL;
//    
//    return 0;
//}

// 0 '' '
' NULL "0" "" ' '
//
//int main(int argc, const char *argv[])
//{
//    printf("%d", '
');
//    return 0;
//}

//指针运算

//++ --
//指针变量改变的长度为指针指向的数据类型的长度

//int main(int argc,const char *argv[])
//{
//    int a[10]={1,2,3,4,5,6,7,8,9,10};// a[0] int  &a[0] int *
//    int *p = a;
//    
//    printf("a[0]=%d
", *p);
//    printf("%p
", p);
//    p++;//sizeof(int)
//    
//    printf("a[1]=%d
", *p);
//    printf("%p
", p);
//
//    p++;
//    printf("a[2]=%d
", *p);
//    printf("%p
", p);
//    
//    p--;
//    printf("%p
", p);
//    p--;
//    printf("%p
", p);
//    
//    return 0;
//}

//int main(int argc,const char *argv[])
//{
//    char ch= 'a';
//    char *p = &ch;
//    printf("%p
", p);
//    p++;
//    printf("%p
", p);
//    p++;
//    printf("%p
", p);
//    p++;
//    printf("%p
", p);
//    return 0;
//}

//减法运算
//元素个数
//不同类型的指针不能进行减法运算
//指针不能进行加法运算
int main(int argc, const char *argv[])
{
    int a[10]={};
    int *p = a;
    int *q = &a[5];
    
    printf("%p %p
", p,q);
    printf("%ld
",  q-p);//(q - p)/sizeof(int)
    
    return 0;
}
原文地址:https://www.cnblogs.com/0515offer/p/4548741.html