#include "stdio.h" #include "stdlib.h" #include "string.h" // void get(int a) // { // a = 20; // printf("%d ", a); // } // void (*FUNP)(int a); // void get1(int *a) // { // *a = 30; // } // void ChangePa(int ** a) // { // int cc = 100; // *a = &cc; // } void main() { // int a = 10;//申请一块内存 命名a 并存放整型20 // int *pa;//定义一个指向整型的指针pa // pa = &a;//指针pa赋值为a的内存地址,改指针可变 // printf("address:%p,value:%d. ", pa,*pa);//pa即为a地址,*pa查找该地址的值 // printf("address:%p,value:%d. ", &a,a);//a的地址,a的值 //////////////////////////////// // address:0060FF28,value:10. // // address:0060FF28,value:10. // //////////////////////////////// // *pa = 20;//通过指针改变内存的值 // printf("address:%p,value:%d. ", pa,*pa);//pa即为a地址,*pa查找该地址的值 // printf("address:%p,value:%d. ", &a,a);//a的地址,a的值 //////////////////////////////// // address:0060FF28,value:20. // // address:0060FF28,value:20. // //////////////////////////////// // a = 30;//通过变量改变内存的值 // printf("address:%p,value:%d. ", pa,*pa);//pa即为a地址,*pa查找该地址的值 // printf("address:%p,value:%d. ", &a,a);//a的地址,a的值 // ////////////////////////////// // address:0060FF28,value:30. // // address:0060FF28,value:30. // // ////////////////////////////// //数组遍历 // int a[] = {1,2,3}; // for (int i = 0; i < 3; ++i) // { // printf("address:%p,value:%d. ",a+i,*(a+i)); // } /////////////////////////////// // address:0060FF1C,value:1. // // address:0060FF20,value:2. // // address:0060FF24,value:3. // /////////////////////////////// // for (int i = 0; i < 3; ++i) // { // printf("address:%p,value:%d. ",a+i,a[i]); // } /////////////////////////////// // address:0060FF1C,value:1. // // address:0060FF20,value:2. // // address:0060FF24,value:3. // /////////////////////////////// ///以上两种方法遍历的结果和作用是一样的 //指针遍历 // int *pa,a[] = {1,2,3}; // pa = a; // for (int i = 0; i < 3; ++i) // { // printf("address:%p,value:%d. ",a+i,*(a+i)); // } // for (int i = 0; i < 3; ++i) // { // printf("address:%p,value:%d. ",pa+i,*(pa+i)); // } /////////////////////////////// // address:0060FF18,value:1. // // address:0060FF1C,value:2. // // address:0060FF20,value:3. // // address:0060FF18,value:1. // // address:0060FF1C,value:2. // // address:0060FF20,value:3. // /////////////////////////////// ///打印的结果完全一样 就是说数组名本来就是个指针 // ----------区别------------ // for (int i = 0; i < 3; ++i) // { // printf("address:%p,value:%d. ",pa,*pa); // pa++; // } //////////////////////////////// // address:0060FF1C,value:1. // // address:0060FF20,value:2. // // address:0060FF24,value:3. // //////////////////////////////// ///可以正常遍历 // for (int i = 0; i < 3; ++i) // { // printf("address:%p,value:%d. ",a,*a); // a++; // } //编译失败 //原因在于数组名是个指针常量 不能够改变a++操作想要改变a内存的值 所以编译失败了。而指针pa是个变量,可以改变,所以能够正常编译和遍历 //申明指针常量 (数组a的名称是个指针常量,那么如何正式定义一个指针常量?) // int a[] = {1,2,3}; // int * const pa= a; // printf("%d ", *(pa+1));//2 // printf("%d ", *(pa++));//指针常量不能改变 编译失败 // const int a 和 int const a 是等价的,无论int还是const在前效果都一样 // const int *pa 和 int const *pa 也是等价的,无论int还是const在前效果都一样 //const int * pa/int * const pa的区别 //---------------------const int * pa--------------- // int a = 10; // printf("address:%p,value:%d. ",&a,a);// address:0060FF28,value:10. // int b = 20; // printf("address:%p,value:%d. ",&b,b);//address:0060FF24,value:20. // int const *p = &a;//初始化p指针为a的内存地址 // printf("address:%p,value:%d. ",p,*p);//address:0060FF28,value:10. // p = &b;//可用过改变p指针 重新导向b的内存地址 // b = 30;//改变b值 // printf("address:%p,value:%d. ",p,*p);//address:0060FF24,value:30. // *p = 40;//通过*p来重新赋值则编译失败 因为*p是个常量 不能被改变 //---------------------int * const pa--------------- // int a = 10; // printf("address:%p,value:%d. ",&a,a);//address:0060FF28,value:10. // int b = 20; // printf("address:%p,value:%d. ",&b,b);//address:0060FF24,value:20. // int * const p = &a;//初始化p指针为a的内存地址 // printf("address:%p,value:%d. ",p,*p);//address:0060FF28,value:10. // *p = 30;//通过*p来重新赋值 改变了a内存的值 // printf("address:%p,value:%d. ",p,*p);//address:0060FF28,value:30. // p = &b;//改变p指针则编译失败 因为p是个指针常量 不能被改变 //--------------------总结-------------------- ///////////////////////////////////////////////////// //const *p 表示*p是个常量 不能通过*p改变内存的值; // //* const p 表示p是个指针常量 不能重新赋值改变p; // ///////////////////////////////////////////////////// //补充三种情况 //-----------------int *指针指向常量----------------- // const int a = 10; // int *pa = &a;//编译错误 因为pa不能够修改常量a的值 // int *pa=(int* ) &i1;//强制转换再赋值 报错 不能修改 // *pa = 100;//报错 不能修改 //-----------------const int *指针指向常量----------------- // const int a = 10; // int const *pa = &a;//可以 //-----------------const int * const指针指向常量----------------- // const int a = 10; // int const * const pa = &a;//可以 但是pa指针啥都不能做了~~~没有任何意义 //函数指针(函数名和数组名一样 也是指针) // int a = 10; // printf("address:%p,value:%d. ",&a,a);//address:0060FF2C,value:10. // get(a); // printf("address:%p,value:%d. ",&a,a);//address:0060FF2C,value:10. // get1(&a); // printf("address:%p,value:%d. ",&a,a);//address:0060FF2C,value:30. // FUNP = &get; // (*FUNP)(a);//都是调用get() // FUNP(a);//都是调用get() // (*get)(a);//都是调用get() // get(a);//都是调用get() // printf("address:%p,value:%d. ",&a,a);//address:0060FF2C,value:30. //方法改变指针的地址和值 // int *pa,a = 10; // printf("address:%p,value:%d. ",&a,a); // pa = &a; // ChangePa(&pa);//要改变指针的值 通过传入指针的地址 在方法内部进行*Pa赋值指针操作 // printf("address:%p,value:%d. ",pa,*pa); //字符串指针 // char c[] = "asd"; // for (int i = 0; i < 3; ++i) // { // printf("address:%p,value:%c. ",c+i,*(c+i)); // } /////////////////////////////// // address:0060FF28,value:a. // // address:0060FF29,value:s. // // address:0060FF2A,value:d. // /////////////////////////////// // char c[] = {'a','s','d'}; // for (int i = 0; i < 3; ++i) // { // printf("address:%p,value:%c. ",c+i,*(c+i)); // } //////////////////////////////// // address:0060FF29,value:a. // // address:0060FF2A,value:s. // // address:0060FF2B,value:d. // //////////////////////////////// /// // char c[3][3] = {{'a','s','d'},{'a','s','d'},{'a','s','d'}}; // for (int i = 0; i < 3; ++i) // { // for (int j = 0; j < 3; ++j) // { // printf("address:%p,value:%c. ",&c[i][j],c[i][j]); // } // } /////////////////////////////// // address:0060FF1F,value:a. // // address:0060FF20,value:s. // // address:0060FF21,value:d. // // address:0060FF22,value:a. // // address:0060FF23,value:s. // // address:0060FF24,value:d. // // address:0060FF25,value:a. // // address:0060FF26,value:s. // // address:0060FF27,value:d. // /////////////////////////////// // char *a[] ={"asdasd","asdasd","ascasd"}; // for (int i = 0; i < 3; ++i) // { // printf("address:%p,value:%s. ",a+i,*(a+i)); // } ///////////////////////////////////// // address:0060FF20,value:asdasd. // // address:0060FF24,value:asdasd. // // address:0060FF28,value:ascasd. // ///////////////////////////////////// }