1.指针就是地址。
2.printf(“a=%x\n”,*p); %x是以十六进制的形式输出数据
3.++p和p++的区别。
++p是先把p+1然后输出,p++是先把p输出然后p+1
4.封装一个函数实现两个数交换
注意:若形参不使用指针,只进行的是值的拷贝,虽然变量名相同,但是内存地址不同,不会影响main函数里的数据
#include<stdio.h>
void chageData(int *data,int *data2)
{
int tmp;
tmp=*data;
*data=*data2;
*data2=tmp;
}
int main()
{
int data=10;
int data2=20;
printf("交换前:data=%d,data2=%d\n",data,data2);
chageData(&data,&data2);
printf("交换后:data=%d,data2=%d\n",data,data2);
return 0;
}
5.输入三个数a,b,c; 要求不管怎么输入,在输出的时候,a,b,c就是由大到小的顺序输出,用函数封装实现.
#include<stdio.h>
void bijiao(int *a,int *b,int *c){
int tmp;
if(*a<*b){
tmp=*a;
*a=*b;
*b=tmp;
}
if(*b<*c){
tmp=*b;
*b=*c;
*c=tmp;
}
if(*a<*b){
tmp=*a;
*a=*b;
*b=tmp;
}
}
int main(){
int a,b,c;
puts("input three numbers:");
scanf("%d%d%d",&a,&b,&c);
printf("before:%d %d %d\n",a,b,c);
bijiao(&a,&b,&c);
printf("after:%d %d %d\n",a,b,c);
return 0;
}
6.指针常量不能++,编译不过
任意类型的指针,sizeof=8
int arr[3]={1,2,3};
int *p=arr;
7.练习 : 将数组中的n个元素按逆序存放函数封装。
#include<stdio.h>
void initArry(int *arr,int size){
int i;
for(i=0;i<size;i++){
printf("请输入第%d个数据:\n",i+1);
scanf("%d",arr++);
}
}
void printArry(int *arr,int size){
int i;
for(i=0;i<size;i++){
printf("%d ",*arr++);
}
putchar('\n');
}
void revangeArry(int *arr,int size){
int i,j;
int tmp;
for(i=0;i<size/2;i++){
j=size-1-i;
tmp=*(arr+i);
*(arr+i);=*(arr+j);
*(arr+j);=tmp;
}
}
int main(){
int arry[5];
int size=sizeof(arry)/sizeof(arry[0]);
initArry(&arry[0],size);
printArry(arry,size);
revangeArry(arry,size);
printArry(arry,size);
return 0;
}
8.关于二维数组地址
int a[3][4]
行地址(父数组) a
列地址(子数组) a[0] a[1] a[2]
#include<stdio.h>
int main(){
int arr[3][4]={{11,22,33,44},{12,13,15,16},{22,66,77,88}};
printf("arr是父亲地址:%p,偏移后是%p\n",arr,arr+1);
printf("arr[0]是子地址:%p,偏移后是%p\n",arr[0],arr[0]+1);
printf("arr[0]是子地址:%p,偏移后是%p\n",*arr,*arr+1);
return 0;
}
运行结果:
9.地址的三种表示方式
&arr[i][j] arr[i][j])
arr[i]+j *(arr[i]+j))
*(arr+i)+j ((arr+i)+j))
10.数组指针=二维数组名 偏移的是整个数组
例:#include<stdio.h>
int main(){
int arr[3][4]={{11,22,33,44},{12,13,15,16},{22,66,77,88}};
int i;
int j;
int *p;
p=&arr[0][0];
int (*p2)[4];
p2=arr;
for(i=0;i<3;i++){
for(j=0;j<4;j++){
printf("%d\n",*(*(p2+i)+j));
}
}
return 0;
}
11.例:输入行列的值,输出对应的数据
#include<stdio.h>
void tipsInputHangLie(int *pm,int *pn){
puts("输入行列值\n");
scanf("%d%d",pm,pn);
puts("done");
}
int getTheData(int (*p)[4],int hang,int lie){
int data;
data=*(*(p+hang)+lie);
return data;
//return p[hang][lie];
}
int main(){
int arr[3][4]={{11,22,33,44},{12,13,15,16},{22,66,77,88}};
int ihang,ilie;
int data;
tipsInputHangLie(&ihang,&ilie);
data=getTheData(arr,ihang,ilie);
printf("%d行%d列的值:%d",ihang,ilie,data);
return 0;
}
12.函数指针
#include<stdio.h>
int inCData(int data){
return ++data;
}
void printWelcome(){
puts("启动启动启动\n");
}
int main(){
void (*p)();//定义一个指针函数变量
int (*p2)(int data);
p=printWelcome;//指向函数
p2=inCData;
(*p)();//调用
printf("p2测试:%d\n",(*p2)(10));
return 0;
}
13.函数指针
#include<stdio.h>
#include<stdlib.h>
int getMax(int data1,int data2){
return data1>data2?data1:data2;
}
int getMin(int data1,int data2){
return data1<data2?data1:data2;
}
int getSum(int data1,int data2){
return data1+data2;
}
int dataHandler(int data1,int data2,int (*pfunc)(int,int)){
int ret;
ret=(*pfunc)(data1,data2);
return ret;
}
int main(){
int a=10;
int b=20;
int cmd;
int ret;
int (*pfunc)(int,int);
puts("1 最大值,2 最小值,3 求和\n");
scanf("%d",&cmd);
switch(cmd){
case 1:
pfunc=getMax;
break;
case 2:
pfunc=getMin;
break;
case 3:
pfunc=getSum;
break;
default:
printf("error");
exit(-1);
break;
}
ret=dataHandler(a,b,pfunc);
printf("ret=%d\n",ret);
return 0;
}
14.指针数组
#include<stdio.h>
#include<stdlib.h>
int getMax(int data1,int data2){
return data1>data2?data1:data2;
}
int getMin(int data1,int data2){
return data1<data2?data1:data2;
}
int getSum(int data1,int data2){
return data1+data2;
}
int dataHandler(int data1,int data2,int (*pfunc)(int,int)){
int ret;
ret=(*pfunc)(data1,data2);
return ret;
}
int main(){
int a=10;
int b=20;
int ret;
int (*pfunc[3])(int,int)={
getMin,
getMax,
getSum};//函数指针数组
for(int i=0;i<3;i++){
ret=(*pfunc[i])(a,b);
printf("ret=%d\n",ret);
}
return 0;
}
15.指针函数(函数的返回值是指针)
#include<stdio.h>
int* getPosPerson(int pos,int (*pstu)[4]){
int *p;
p=(int *)(pstu+pos);
return p;
}
int main(){
int scores[3][4]={
{55,66,77,88},
{66,55,99,100},
{11,22,33,59},
};
int *ppos;
int pos;
printf("请输入号数:0 1 2\n");
scanf("%d",&pos);
ppos=getPosPerson(pos,scores);
for(int i=0;i<4;i++){
printf("%d ",*ppos++);
}
return 0;
}