指针

#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.  //
/////////////////////////////////////

}
原文地址:https://www.cnblogs.com/godehi/p/13087352.html