#include//取地址操作符为&,也称引用,通过该操作符可以获取一个变量的地址值//取值操作符是*,也成解引用,通过该操作符可以得到一个地址对应的数据//指针是为了保存地址,应用是偏移和传递//&符号是取地址,指针变量的初始化一定是某个变量取地址intmain(){int i =5;int* i_pointer =&i;//i_pointer是一个整型指针类型的数据printf("i = %d\n", i);//直接访问printf("*p = %d\n",*i_pointer);//间接访问,读取地址对应数据,*指针变量return0;}
1
2
3
4
5
6
7
8
9
10
11
12
13
2. 指针的传递使用
#define_CRT_SECURE_NO_WARNINGS#includevoidchange(int*j)//j是形参,当i传递地址时,那么j就是指针类型,j=&i{*j =5;//*j表示解引用,取i的地址,访问i的空间,并且赋值}//上句是指针的间接访问intmain(){int i =10;//i是局部变量printf("before change i = %d\n", i);change(&i);//把i的地址传过去//change(i);//i称为实参,调用函数将i的值赋给j,函数调用时是值传递printf("after change i = %d\n", i);return0;}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
3. 指针偏移使用
#define_CRT_SECURE_NO_WARNINGS#include//内存分为3种权限,掌握两种:可读、可写//数组是特殊的,不能和整型变量,浮点型,字符型变量进行类比//数组名是不可赋值的,数组名 a 类型是数组,a里面存了一个值,是地址值,是数组的起始地址intmain(){int a[5]={1,2,3,4,5};//a里面存了一个值就是数组的起始地址int* p;//p是整型指针,对一个指针变量进行取值,得到的类型是其基类型
p = a;//将数组a的起始地址赋值给p,p指向数组的起始地址printf("*p = %d\n",*p);//p的基类型是int,所以是4个字节,使用%dfor(int i =0; i <5; i++){printf("%d\n",*(p + i));}return0;}//p+1表示加一个基类型的字节数,这里是增加4个字节
//数组是放在栈空间,数组一开始定义好就确定下来了#define_CRT_SECURE_NO_WARNINGS#includeintmain(){int i;//申请多大的空间scanf("%d",&i);//输入要申请的空间大小char* p;
p =(char*)malloc(i);//使用malloc动态申请堆空间,char类型是1个字节//int* p1;//p1 = (int*)malloc(20);//malloc申请空间的单位是字节,申请20个字节则只能存放5个int型变量strcpy(p,"malloc success");//strcpy是copy函数,将字符串放入p中puts(p);free(p);//释放空间,p的值必须和最初malloc返回的值一致
p =NULL;//指向一个不属于自己的空间,称之为"野指针"//如果不把p值为NULL,把p称为野指针return0;}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
7. 栈空间与堆空间的差异
#define_CRT_SECURE_NO_WARNINGS#includechar*print_stack()//栈空间,char*表示返回值类型{char c[17]="I am print_stack";puts(c);//能够正常打印return c;//return的返回值c 类型是char*,c是起始地址,p=print_stack指向要访问的空间}char*print_malloc()//堆空间{char* p =(char*)malloc(30);//申请空间要进行类型强转strcpy(p,"I am print_malloc");puts(p);//能够正常打印return p;}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
8. 字符指针与字符数组的初始化
#define_CRT_SECURE_NO_WARNINGS#includeintmain(){char* p ="hello";//把字符串型常量"hello"的首地址赋给p,指针变量是4个字节char c[10]="hello";//等价于strcpy(c,"hello"),放入栈空间,栈空间可读可写
c[0]='H';//p[0]='H';//不可以对常量区数据进行修改,printf("c[0]=%c\n", c[0]);printf("p[0]=%c\n", p[0]);
p ="world";//将字符串world的首地址赋给p,任何字符串都有自己的首地址puts(p);//c = "world";//非法return0;}
#define_CRT_SECURE_NO_WARNINGS#includeintmain(){int n;scanf("%d",&n);int i =1;int total =1;for(i =1; i <= n; i++){
total = total * i;}printf("%d\n", total);return0;}