[TOC]
第八章 针指
指针测试
#include
int main() {
int a=1000;
int *p;
p=&a;
printf("a=%d,&a=%d\n",a,&a);
printf("*p=%d,p=%d\n",*p,p);
a=521;
printf("a=%d,&a=%d\n",a,&a);
printf("*p=%d,p=%d\n",*p,p);
return 0;
}
打印结果
a=1000,&a=6487572
*p=1000,p=6487572
a=521,&a=6487572
*p=521,p=6487572
指针要求
必须同类型转换
指针必须给初值(实例化)
指针赋值的方式 int *p=&a;
或者 int a=100; int *p; p=&a;
指针指针先指向地址,然后才可以赋值
#include
int main() {
void fun(int *a,int *b);
int a=10;
int b=20;
int *p=&a, *q=&b;
int *temp;
printf("&a=%d &b=%d\n",&a,&b);
printf("p=%d q=%d\n",p,q);
if(a
temp=q; //p q 指针交换 a b 不受影响
q=p;
p=temp; //最大值打印*p
}
printf("&a=%d &b=%d\n",&a,&b);
printf("p=%d q=%d\n",p,q);
printf("%d\t%d",*p,*q);
return 0;
}
指针交换数值
#include
int main() {
void fun(int *a,int *b);
int a=10;
int b=20,c=0;
int *p=&a, *q=&b;
int *m;
m=&c;
if(a
{
*m=*p;
*p=*q;
*q=*m;
}
printf("max=%d\tmin=%d\n",a,b);
printf("max=%d\tmin=%d",*p,*q);
return 0;
}
数值交换指针+函数写法
#include
int main()
{
int a=10;
int b=20;
void change(int *,int *);
change(&a,&b);
printf("a=%d\tb=%d",a,b);
return 0;
}
void change(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
指针倒序数组
#include
void inv(int a[],int size);
void xinginv(int *a,int size);
int main() {
int a[]= {1,2,3,4,5,6,7,8,9,10};
int *p;
p=a;
inv(a,10);
xinginv(p,10);
for(int i=0; i<10; i++) {
printf("%d\t",*(p+i));
}
return 0;
}
// 数组倒叙
void inv(int a[],int size) {
for(int i=0; i
int temp=0;
temp=a[size-i-1];
a[size-i-1]=a[i];
a[i]=temp;
}
}
void xinginv(int *p,int size) {
for(int i=0; i
int temp=0;
temp=*(p+i);
*(p+i)=*(p+size-i-1);
*(p+size-i-1)=temp;
}
}
二维数组利用指针表示
#include
int main() {
int a[3][4] {{1,2,3,4},{5,6,7,9},{10,11,12,13}}; //定义一个二维数组
printf("第0行地址%d\n",a);
printf("第1行地址%d\n",a+1);//地址输出 a+1 一行地址
printf("第2行地址%d\n",a+2);
printf("第0行0列地址%d\n",*a);
printf("第0行1列地址%d\n",*a+1);
printf("第0行2列地址%d\n",*a+2);
printf("第1行2列地址%d\n",*(a+1)+2); // *(a+1)+2 1行2列地址
// 二维数组要用指针输出值: 有两个** 或者两个[][]就可以
printf("第0行0列值%d\n",*(*a));
printf("第0行1列地址%d\n",*(*a+1));
printf("第0行2列地址%d\n",*(*a+2));
printf("第1行2列地址%d\n",*(*(a+1)+2));
printf("第2行2列值%d\n",*(a[2]+2));
//或者一个 *(a[2]+2) 表示值
for(int i=0; i<3; i++) {
for(int j=0; j<4; j++) {
printf("%8d",*(*(a+i)+j));
}
printf("\n");
}
printf("\n");
int *p; //*p =(*p)[1];
p=*a; //把一行的地址指向了p 指针还是一列 指针无行数 ,无限长
int (*q)[4];
q=a; //重要 ::::: 这是把指针控制了行数 ,有了行数,就转换为二维数组表示方式
for(; p
printf("(byte)%8d-%8d=(int)%d\n",p,a[0],p-a[0]);
}
p=*a;
printf("\n 打印");
for(; p
if((p-(*a))%4==0) {
printf("\n");
}
printf("%6d",*p);
}
return 0;
}
指针控制行数 和二维数组交互
#include
int main()
{
int a[3][4] {{1,2,3,4},{5,6,7,9},{10,11,12,13}};
int (*q)[4]=a;
//重要 ::::: 这是把指针控制了行数
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
printf("%8d",*(*(q+i)+j));
}
printf("\n");
}
return 0;
}
指针函数
#include
int main(){
int max(int x,int y);//声明
int add(int x,int y);
// 指向一个函数的指针
int (*p)(int,int); //只能指向一个返回值为int类型,有两个int参数的函数
p = max;//max表示函数在内存的地址
int z;
z = (*p)(7,8); //z = max(7,8);
printf("max = %d\n",z);
p = add;
z = (*p)(7,8);
printf("add = %d\n",z);
return 0;
}
int max(int x,int y){
if(x>y) return x;
else return y;
}
int add(int x,int y){
return (x+y);
}
返回函数指针
#include
int main() {
int *fun(int a,int b);
int *p= fun(1,2);
printf("*p=%8d \tp=%8d",*p,p);
return 0;
}
int *fun(int a,int b) {
int c=a+b;
return &c;
}