[TOC]
第八章 針指
指針測試
#include<stdio.h>
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;
}
打印結(jié)果
a=1000,&a=6487572
*p=1000,p=6487572
a=521,&a=6487572
*p=521,p=6487572
指針要求
必須同類型轉(zhuǎn)換
指針必須給初值(實(shí)例化)
-
指針賦值的方式 int *p=&a;
或者 int a=100; int *p; p=&a;
指針指針先指向地址,然后才可以賦值
#include<stdio.h>
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<b) {
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;
}
指針交換數(shù)值
#include<stdio.h>
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<b)
{
*m=*p;
*p=*q;
*q=*m;
}
printf("max=%d\tmin=%d\n",a,b);
printf("max=%d\tmin=%d",*p,*q);
return 0;
}
數(shù)值交換指針+函數(shù)寫法
#include<stdio.h>
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;
}
指針倒序數(shù)組
#include<stdio.h>
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;
}
// 數(shù)組倒敘
void inv(int a[],int size) {
for(int i=0; i<size/2; 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<size/2; i++) {
int temp=0;
temp=*(p+i);
*(p+i)=*(p+size-i-1);
*(p+size-i-1)=temp;
}
}
二維數(shù)組利用指針表示
#include<stdio.h>
int main() {
int a[3][4] {{1,2,3,4},{5,6,7,9},{10,11,12,13}}; //定義一個(gè)二維數(shù)組
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列地址
// 二維數(shù)組要用指針輸出值: 有兩個(gè)** 或者兩個(gè)[][]就可以
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));
//或者一個(gè) *(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 指針還是一列 指針無行數(shù) ,無限長
int (*q)[4];
q=a; //重要 ::::: 這是把指針控制了行數(shù) ,有了行數(shù)败匹,就轉(zhuǎn)換為二維數(shù)組表示方式
for(; p<(*a)+12; p++) {
printf("(byte)%8d-%8d=(int)%d\n",p,a[0],p-a[0]);
}
p=*a;
printf("\n 打印");
for(; p<(*a)+12; p++) {
if((p-(*a))%4==0) {
printf("\n");
}
printf("%6d",*p);
}
return 0;
}
指針控制行數(shù) 和二維數(shù)組交互
#include<stdio.h>
int main()
{
int a[3][4] {{1,2,3,4},{5,6,7,9},{10,11,12,13}};
int (*q)[4]=a;
//重要 ::::: 這是把指針控制了行數(shù)
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
printf("%8d",*(*(q+i)+j));
}
printf("\n");
}
return 0;
}
指針函數(shù)
#include<stdio.h>
int main(){
int max(int x,int y);//聲明
int add(int x,int y);
// 指向一個(gè)函數(shù)的指針
int (*p)(int,int); //只能指向一個(gè)返回值為int類型,有兩個(gè)int參數(shù)的函數(shù)
p = max;//max表示函數(shù)在內(nèi)存的地址
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);
}
返回函數(shù)指針
#include<stdio.h>
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;
}