标签:位置 函数 编译 运算符 变量 注意 mil 操作 wap
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,b
然后再定义一个临时的指针变量,用来存储中间变量
然后将b的变量的内存地址赋值给t,注意这里 t 代表的是内存地址
然后把b的值给a,再用b接受t地址所存储的变量, 注意这里的*t是指t这个地址所指的那个变量。
指针与数组
其实数组的int a[10];
里来说a其实是这个数组的第一个元素的a[0]的指针
所以数组变量本身就是表达地址,所以
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、动态申请内存.......
具体的后续会更。
标签:位置 函数 编译 运算符 变量 注意 mil 操作 wap
原文地址:https://www.cnblogs.com/BlogOfMr-Leo/p/8977142.html