#include<cstdio>
#include <iostream>
using namespace std;
#include<cstdio>
struct student //struct 不声明都是public 与class相反
{
int snum; //定义
int age, grade; //定义
};
student T; //声明
student *pt;
int main()
{
int *p, *q; //定义了一个指针和一个普通变量
int *c[10]; //声明一个有十个指针(p[0],p[1],p[2],…,p[9])的数组,每个元素都是一个指针
int a;
p = &a; //普通变量指针一个指针等于 a的内存地址 &指内存地址
a = 10;
printf("1 %d\n", *p); // *p 等于p指针内存地址等于a内存地址 一个变量的地址永远不会变
a = 15;
printf("1 %d\n", *p);//*p 等于p指针内存地址等于a内存地址 一个变量的地址永远不会变
a = 1;
p = &a; //普通变量指针一个指针等于 a的内存地址 &指内存地址
q = p + 1; //内存地址加1 等于后移4个字节
printf("2 %p %p \n", p, q); //%p 输出字节 q多了4因为int类型是4个字节,所以加int类型的1会往后移4个字节。
printf("2 %d \n %d", *p, *q); //*p 等于p指针内存地址等于a内存地址 一个变量的地址永远不会变
printf("\n ========== 指针数组 ======= \n");
int b[10] = { 0,2,4,6,8,10,12,14,16,18 }; //需要指定指针类型 数组,每个元素都是一个指针
//(a前面定义了为不是指针,不可用a,改成了b)
// int *p;
for (p = &b[0]; p<&b[0] + 4; p++) //p = &a[0] 初始化值 (a前面定义了为不是指针,不可用a,改成了b)
// p<&a[0] + 4 小于4继续循环
//p++ 内存地址加1(后移4个字节)
printf("\n %d ", *p);
printf("\n ========== 指针数组2 ======= \n");
//p = b;
/p最后一次p++等于p[4]=8
printf("%d\n", *b); //0 数事实上,数组你可以看成一个指针
printf("%d\n", *(b + 1));// 2 b[1]=2 b[5]=10 注意加括号了
printf("%d\n", *p); //8
printf("%d\n", *(++p)); //10 内存地址加1(后移4个字节)
printf("\n ========== 指针数组2.1 ======= \n");
p = b; //用作b重新赋值给p指针
printf("%d\n", *b); //0 数事实上,数组你可以看成一个指针
printf("%d\n", *(b + 1));// 2 b[1]=2 b[5]=10 注意加括号了
printf("%d\n", *p); //0
printf("%d\n", *(++p)); //2 内存地址加1(后移4个字节)
printf("\n ========== 结构体指针 说明 ======= \n");
pt = &T; //普通变量指针一个指针等于 T的内存地址 &指内存地址 T调用函数student
T.snum = 15;
T.age = 12;
T.grade = 90;
printf("%d\n", (*pt).snum); // 括起来,就可以当该指针指向的结构体用了
printf("%d\n", pt->age); // ->等同. 这里等同T.age
printf("%d\n", T.grade);
printf("\n ========== 多重指针 说明 ======= \n");
int **pp, *qa;//p就是指向一个指针的指针,q是指向一个普通变量的指针
int aa;
aa = 1;
qa = &aa;
pp = &qa;
printf("%p %p %p %p\n", pp, *pp, qa, &aa); //打印内存地址
printf("%d %d %d", **pp, *qa, aa);
system("pause");
}