指针运算
初始化: int a,*p ; p=&a; or int a, *p=&a;
p=&a, *p=10(代表把10赋值给a)
printf("%d",*p)
scanf("%d",p)
空指针: p=NULL
赋值方式:直接赋值 a=b;间接赋值:a=*p
注意: “*” 代表的是“解”符号;在实用指针之前,必须要有指向;指针变量的初值必须为 ”地址值“
eg: char *p=" i love china"在指针上,字符串就是一个地址。
字符串注意点:1.只要说明了是字符串,说明该字符串末尾一定有一个结束字符'\0' 2.利用strlen 计算长度时,不算上 结束字符的长度。所以实际长度:实际字符个数+1。 3.定义的时候可以不用写明长度:char string[]=" i love china";
这里可以让 p 直接指向 字符串地址, p="i love china"; 若要修改字符串:char str[20],*p=str; gets(str);
注意:当 定义: char str[]=..... p=str 则可以: *p= " abcdef" 若 这样定义: char *p=" abcedf" 则不可以这样改: *p= "asdqwe"注意:字符串在改动结束后,末尾一定要加上 '\0'
• 删除字符串给定字符:char f while(d[i]!='\0'){ if(d[i]!=f) d[k++]=d[i] i++ } d[k]='\0'
在定义字符数组的时候:1.char string[]="i am a boy" 或者 char string[20]; gets(string)
定义:如果为整型指针*p,则该指针必须只可以指向同类型变量,同理float型。
强制类型转换:double d,*q=&d; p=(int *)q
注意:在利用指针变量进行值的交换的时候,用该形式:p=*p1;*p1=*p2;*p2=p;
指针关系运算符只有指向同类才有意义
①:p==q(比较是否都指向同一个位置);②:p>q(比较所指位置的先后顺序); 注意: 若用if ,while 语句进行判断:是 :1 否: 0 。③:p-q 表示 指针之间的元素个数:eg: p=a,q=&a[5]; 则q-p=5。
指针求最大最小(擂台法):p=a;max=min=*p;for(.....) if(*p>max) max=*p ; if(*p<min) min=*p;
数组名就是首地址常量,a[10].a==&a[0];在指针指向中,则让:p=a;(就是p=&a[0]); 移动指向位置:①(一维):*(p+i);②(二维):*(*(p+i)+j); 不可对数组名(a)进行 加减,赋值;而指针是个变量,所以可以。
这里的指向移动涉及到for循环;
或者每一次循环进行p++;要注意的是,循环完毕后,p的位置要复位:p=a;
注意;p++与++p
eg:输入:for(i=0;i<10;i++,p++) scanf("%d",p);输出:for(p=a,p<a+10;p++) printf("%d",*p);
二维的另一种表现形式: *(p[i]+j))
取地址运算符:& 取内容运算符: *
注意:*p++(* 和 ++ 是同级运算符,是从右到左运算!)
eg: char *p=" c language” for(;*p!'\0';) putchar(*++p); 所以该字符 直接从 空格处开始输出。
注意:putchar getchar -> putchar(a); c=getchar(); puts gets -> char a[10] gets(a);puts(a);
注意换行:printf("\n");
指针数组
int *p[6], 说明数组里的每一个元素都是指针类型;改写: int (*p)[6](一维), 该数组(这个整体为指针)
二维指针数组: a[2][3],*p[2], 则*p[0],*p[1],分别指a数组的 第一行,第二行 元素! 运算: p[i]=a[i];
指针数组输入:scanf("%d",p[i]+j); scanf("%d",p[i][j])输入二维字符串,char a[2], for(i=0;i<2;i++) scanf("%s",a[i]); 注意: 字符串 的输入与输出 都是 a[i]形式!