C语言程序设计细节,C语言程序设计 细节总结(第8章 指针)

1-810-jpg_6-1080-0-0-1080.jpg

本文链接:

1.指针变量定义及数组:int a; int *p=&a; 或 int a; int *p; p=&a;

2.指针运算符:(1)取地址运算符& (2)取内容运算符* (结合性均为右至左)

3.指针加1,不是纯加1,而是加一个所指数组的字符个数

4.指针变量作为变量参数,例,交换变量swap():

#include

void swap1(int *p1,int *p2) //交换地址中的值

{

int t; //p1,p2中存的是a和b的地址,将p1和p2地址中的内容交换,即p1中a地址中值变为b,p2中b地址中值变为a

t=*p1;

*p1=*p2;

*p2=t;

}

void swap2(int *p1,int *p2) //交换形参指针指向的地址,无法返回给主函数p1,p2

{

int *t; //交换后p1指向b地址,p2指向a地址,仅形参指向改变,不影响实参

t=p1;

p1=p2;

p2=t;

}

int main()

{

int a,b;

int *p1,*p2;

p1=&a;

p2=&b;

while(~scanf("%d%d",p1,p2))

{

printf("a=%d,b=%d\n",a,b);

printf("p1=%d,p2=%d\n",p1,p2);

swap1(p1,p2);

printf("交换值结果:\n");

printf("a=%d,b=%d\n",a,b);

printf("p1=%d,p2=%d\n",p1,p2);

/*

swap2(p1,p2);

printf("交换地址测试结果:\n");

printf("a=%d,b=%d\n",a,b);

printf("p1=%d,p2=%d\n",p1,p2);

*/

}

return 0;

}

1.定义及数组:int a[5],*p; p=&a[0]; 或p=a;

efbf7793ac87fb771945533d97248e3a.png

2.引用数组元素

(1)地址表示法:a[i]的地址:p+3、a+3、&a[i]

(2)数组元素表示法:a[i]的访问:*(p+3)、*(a+3)、a[i]

(3)指针变量加数组:指针变量可以加下标:p[i]

(4)指针变量与函数名的引用区别:数组名表示函数首地址做c语言程序设计的总结,属于常量,p为指向数值a的指针变量,p++可以,a++不可以

(5)例,逆序输出10个数

#include

int main()

{

int i,n,*p,a[10];

p=a;

while(~scanf("%d",&n))

{

for(i=0; i

{

scanf("%d",&a[i]);

}

for(i=n-1; i>=0; i--) //下标法访问数组

{

printf("%d ",a[i]);

}

printf("\n");

for(i=n-1; i>=0; i--) //数组名访问数组

{

printf("%d ",*(a+i));

}

printf("\n");

for(i=n-1; i>=0; i--) //指针变量访问变量(1)

{

printf("%d ",*(p+i));

}

printf("\n");

for(p=a+n-1; p>=a; p--) //指针变量访问变量(2)

{

printf("%d ",*p);

}

printf("\n");

}

return 0;

}

3-810-jpg_6-1080-0-0-1080.jpg

int s[3][4];

1.行转列:s+0、s+1、s+2是每一行的首地址,进行的是行操作,若想借助s对行中各元素操作,必须将行操作方法转为列操作模式。转换方法*(s+i)(i=0,1做c语言程序设计的总结,2)

2.二维数组的指针表示方式:

(1)数组首地址:s

(2)i行首地址:s+i = &s[i]

(3)i行j列元素地址:s[i]+j = *(s+i)+j = &s[i][j]

(4)i行j列元素:*(s[i]+j) = *(*(s+i)+j) = s[i][j]

81e30a33bbe6451f2ed860b509aa98fd.png

3.指向多维变量的指针:

(1)指向数组元素的指针变量 int p=s[0];

(2)指向由m个元素构成的一维数组的指针变量:int (*p)[4]; p=s;

例:

#include

int main()

{

int s[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

//(1)用指向数组元素的指针变量输出数组元素

int *p1;

for(p1=s[0]; p1

{

if((p1-s[0])%4==0)

{

printf("\n");

}

printf("%d ",*p1);

}

printf("\n");

//(2)用指向一维数组的指针变量输出任一行任一列的元素

int i,j;

int (*p2)[4];

p2=s;

scanf("%d%d",&i,&j);

printf("%d\n",*(*(p2+i)+j));

return 0;

}

1.可以不定义字符字段,直接定义指向字符串的指针变量,利用指针变量操作字符串,如:

char *str = “I’m a student”; printf(“%s\n”,str);

111a3f1903cf1631482ac39d26b77e91.png

1.定义指向数组的指针变量格式:数据类别(*指针变量名)();

2.赋值格式:指针变量名=函数名;

3.调用格式:(*指针变量名)(实参表)

例:

//输入5个数,求最大值

#include

int max(int *p)

{

int i;

int m=p[0];

for(i=1; i<5; i++)

{

if(*(p+i)>m) m=*(p+i);

}

return m;

}

int main()

{

int i,m,a[5];

int (*f)(int *p); //定义指向函数的指针变量f

for(i=0; i<5; i++)

{

scanf("%d",&a[i]);

}

f=max; //将函数max入口地址赋值给f

m=(*f)(a); //利用指针变量f调用函数

printf("%d\n",m);

return 0;

}

4.指向数组的指针做变量参数

5.返回指针值的变量

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-122152-1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值