c语言的指针的存在使得c语言对硬件的操控,以及灵活性获得了极大的提升。数组
可是指针的使用存在着不少难点问题。函数
#include<stdlib.h> #include<stdio.h> //这里的函数是指针作参数的例子,要知道这个特性能够弥补c语言只能有一个返回值的特性。 void swap1(int *pa,int *pb){ int t =*pa; *pa=*pb; *pb=t; } //main()函数必需要返回一个数字 int main(){ int a =15; int b=10; int* t; t=&b; a=b; b=*t; printf("%d\n",b); swap1(&a,&b); printf("%p\t%p",a,b); return 0; }
这里咱们先定义两个整型的变量a,bspa
而后再定义一个临时的指针变量,用来存储中间变量指针
而后将b的变量的内存地址赋值给t,注意这里 t 表明的是内存地址code
而后把b的值给a,再用b接受t地址所存储的变量, 注意这里的*t是指t这个地址所指的那个变量。blog
指针与数组内存
其实数组的int a[10];io
里来讲a实际上是这个数组的第一个元素的a[0]的指针编译
因此数组变量自己就是表达地址,因此class
1 int a[10]; 2 int *p=a; //无需用&取地址 3 4 可是数组的单元表达的是变量,须要用&取地址 5 a==&a[0]; 6 7 []运算符能够对数组作,也能够对指针作: 8 9 10 p[0] <==>a[0]; 11 这里的p[0]至关于*p 12 13 *a能够表示a[0] 14 15 数组变量是const的指针
const 这个修饰符的做用就是代表一个变量是指定的值不能改变了
int* const p=&i; //p是const *q=26;//OK q++; //ERROR
1 int ls=58; 2 int ls1=64; 3 int* const q=&ls; 4 *q =10; 5 *q=20; 6 // q = &ls1; 这句是不能经过编译的,由于这个指针是不能指向其余位置的地址 7 //执行成功说明这里的指针变量是能够被改变的 8 ls=36 ; 9 printf("\n%d",*q); 10 //而后咱们来看另一种状况 11 int P1=10; 12 int P2=20; 13 int const *T=&P1; 14 T=&P2;//执行结果为30 15 //*T =15;这里是不能经过编译的,由于这个指针指向的位置存储的变量是不能赋值改变的。 16 P2=30; 17 printf("\n%d",*T); 18 //关键在于这里的const是在*的前面仍是后面决定的 19 return 0;
1 void mai(const int*p){ 2 3 int *ls=*p; 4 printf("ls的地址:%p",ls); 5 } 6 这里咱们传入了一个指针,可是在函数里,是不能改变这个指针所指向的值的
指针的运算
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 int main(){ 5 int i,j; 6 i=10;j=12; 7 printf("i,j:%d,%d\n",&i,&j); 8 printf("i,j:%d,%d",*&i+1,&j); 9 printf("\n&i-&j:%d",(&i)-(&j));//这里两个地址作差实际上是地址差/类型所占的位数 10 11 int *p; 12 p=&i; 13 *p++;//其实是*(p++);++优先级比*高;数组遍历 14 printf("\n*p:%d",*p); 15 return 0; 16 }
指针的类型转换
void*表示不知道指向什么东西的指针
指针变量的大小是相同的可是,指针是有类型的差异
总之指针的做用
1、须要传入较大的数据的时候用作参数 2、传入数组后对数组作操做 3、函数返回的结果不止一个的时候能够用指针带出(c只能return一个变量,或者值) 须要要用函数来修改不止一个变量 4、动态申请内存.......
具体的后续会更。