mov指令是汇编语言中的指令,指的是数据的传送;也就是说指针只存放变量的地址和类型,而mov才是存放数据的值;(所以才有不同读写长度对应的mov指令不同);
struct pointer{
long address;
int type;
}
语法格式:
type pointer;
int ip;
char cp;
student sp;
指针运算符“*”:取出指针所指位置的数据;
取地址运算符“&”:得到变量所在的内存位置,即其内存地址;
例如:
int c=8;
int *i=&c;
printf("%d\n",*i); //*i指向变量c的内容
printf("%p\n",i);//i指向的是变量c的地址
也就是说,可以通过变量ip去寻找c的地址,再通过指针*取变量c的内容;
指针之间的赋值
int i=100;
int *ip=&i;
int *iq;
iq=ip;//ip和iq指向同一内存单元
printf("*ip==%d——*iq==%d\n",*ip,*iq);
//此时取ip指向的值与iq指向的值都是指向变量 i=100的地址
如何定义一个指针?
#include <stdio.h>
int main(int argc,const char* argv[]){
int a;
int *p=&a;//把a的地址赋给p,p——>&a
//把变量名换成指针名,在前面+*,就是指向变量地址的指针了
printf("%d\n",*p);//取存在p中的地址的值
return 0;
}
#include <stdio.h>
int main(int argc,const char* argv[]){
int *arr[4][3];
int *(*parr)[4][3]=&arr;//把a的地址赋给p,parr——>&arr
//把变量名换成指针名,在前面+*,就是指向变量地址的指针了
return 0;
}
指针运算
如何取值?使用“*”运算符,如:
#include <stdio.h>
int main(int argc,const char* argv[]){
int a=100;
int *p=&a;//把变量a的地址存到指针变量p中
printf("%d\n",*p);//从指针变量p中取取出指向地址中的那个值
return 0;
}
指针的运算:指针可以进行赋值运算、关系运算、算数运算;
指针+1:表示向高位移动一步,这一步表示时当前指针类型所占的字节数;
指针-1:表示向低位移动一步,这一步表示时当前指针类型所占的字节数;
#include <stdio.h>
int main(int argc,const char* argv[]){
int a=100;
int b=200;
int c=300;
int *pa=&a;
int *pb=&b;
int *pc=&c;
printf("%d\n",*(pb));
//取pb指向的地址里存的那个值;
printf("%d\n",*(pb+1));
//取pb指向的地址向上跨越了1个int的字节数,等效于*pa;
printf("%d\n",*(pb-1));
//取pb指向的地址向下跨越1个int的字节数,等效于*pc;
return 0;
}
指针强转
int arr[3]={1,2,3};
int * parr[3]=&arr;//称parr为arr整个数组的指针
for(int i=0;i<3;i++){
printf("%d\n",*(parr+i));//获取parr跨越i个元素的值,等效于arr[i];
}
int *ptemp=&arr[0];
/*常用int *ptemp=arr,因为arr本身包含首元素的地址;
数组名当参数传递是,,所传递的是其首元素的地址,所以数组当参数传递时,无法通过sizeof计算出数组长度;
*/
void test(int* a){
for(int i=0;i<3;i++){
printf("%d\n",a[i]);
}
int main(int argc,const char* argv[]){
int arr[3]={1,2,3};
test(arr);
指针数组
#include <stdio.h>
int main(int argc,const char* atgv[]){
int a=100,b=200;
int *pa=&a;
int *pb=&b;
int *arr[2]={pa,pb};
//指针数组里面的元素是指针,pa是指向a的指针,pb是指向b的指针;
//*arr[i]就是取数组里第i个元素所指向的地址的值;
for(int i=0;i<2;i++){
printf("%d\n",*arr[i]);
}
return 0;
}
指针与字符串