// // 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\n", &a); // return 0; //} //指针变量: 保存变量内存地址的工具 //本质是变量,保存其它变量的地址 //int *p = &a; //数据类型(指针指向变量的数据类型) + *(指针变量说明符) + 变量名; //int * 是指针变量的类型 //int main(int argc, const char *argv[]) //{ // int a=100; // int *p = &a; // printf("%p\n", &a); // printf("%p\n", p); // // //指针变量也有自己地址 // printf("%p\n", &p); // // return 0; //} //间接寻址 * //通过变量的地址寻址到对应地址的变量空间 //* & 是一对互逆运算符 //int main(int argc,const char *argv[]) //{ // int a=100; // int *p = &a; // // printf("%p\n", &a); // // printf("a= %d\n", *p); // printf("a = %d\n", *&a); // printf("a = %d\n", a); // // return 0; //} //指针变量的大小 //只跟平台有关, 32位平台占4字节 64位平台占8字节 //int main(int argc,const char *argv[]) //{ // printf("size = %lu\n", sizeof(char *)); // printf("size = %lu\n", sizeof(int *)); // printf("size = %lu\n", sizeof(long *)); // printf("size = %lu\n", 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\n", *q); // *q = 300; // printf("a = %d\n", *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\n", *(int *)p); // p = &b; // printf("b = %ld\n", *(long *)p); // p = &f; // printf("f = %f\n", *(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\n", p); // //4.释放内存 // free(p); // //5. // p = NULL; // // return 0; //} // 0 '\0' '\n' NULL "0" "\0" ' ' // //int main(int argc, const char *argv[]) //{ // printf("%d", '\n'); // 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\n", *p); // printf("%p\n", p); // p++;//sizeof(int) // // printf("a[1]=%d\n", *p); // printf("%p\n", p); // // p++; // printf("a[2]=%d\n", *p); // printf("%p\n", p); // // p--; // printf("%p\n", p); // p--; // printf("%p\n", p); // // return 0; //} //int main(int argc,const char *argv[]) //{ // char ch= 'a'; // char *p = &ch; // printf("%p\n", p); // p++; // printf("%p\n", p); // p++; // printf("%p\n", p); // p++; // printf("%p\n", p); // return 0; //} //减法运算 //元素个数 //不同类型的指针不能进行减法运算 //指针不能进行加法运算 int main(int argc, const char *argv[]) { int a[10]={}; int *p = a; int *q = &a[5]; printf("%p %p\n", p,q); printf("%ld\n", q-p);//(q - p)/sizeof(int) return 0; }