指针(一)
来源:互联网 发布:js随时检测窗口大小 编辑:程序博客网 时间:2024/05/22 01:27
用指针交换大小
#include<stdio.h>int main(){ int a,b,*p1,*p2,*p3; scanf("%d,%d",&a,&b);//注意这里规定输入有, 则必须输入的形式为4,5 p1=&a; p2=&b; if(a<b) {p3=p1;p1=p2;p2=p3;} printf("%d,%d",a,b); printf("%d %d",*p1,*p2); return 0;}
用指针变量作函数参数大小排序
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>void swap(int *p1, int*p2)//注意若引用该函数,则就是交换顺序,不需要再次比较大小{ int temp;//不能使用int*temp;因为*temp赋值就是向一个未知存储单元赋值,而该位置存储单元可能存有有用的数据 temp = *p1; *p1 = *p2; *p2 = temp;}void exchange(int*p1,int*p2,int*p3){ if (*p1 < *p2) swap(p1,p2);//注意这里比较的是整数的大小而不是地址的大小 if (*p1 < *p3) swap(p1, p3); if (*p2 < *p3)swap(p2, p3);}int main(){ int a, b, c, *p1, *p2, *p3; scanf("%d%d%d", &a, &b, &c); p1 = &a; p2 = &b; p3 = &c;//表达式皆用分号,即使在同一行 exchange(p1, p2, p3); printf("%d,%d,%d", a, b, c); return 0;}
通过指针引用数组
通过指针引用数组元素
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>int main(){ int a[10],i,*p=a;//int*p=a;相当于int*p;p=a; for (i = 0; i < 10; i++) scanf("%d", p++);//当循环结束p=a+10 for (i = 0, p = a; i < 10; i++)//所以当下个循环开始时,应该把p重新初始化为a printf("%d ", *p++);//++和*优先级相同,根据结合方式为自右向左,他等价于*(p++),先引用*p,再自加 return 0; //若p初始为p=a+3;则p+1为a+4}
用数组名作函数参数
用数组名或指针变量做形参能改变实参的值。用变量名作形参,不能改变实参的值。
fun(int arr[],int n);等价于fun(int*arr,int n);
将数组a中n个整数按相反顺序存放
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>void inv(int*p,int n){ int i, temp; for (i = 0; i <= (n - 1) / 2;i++) { temp = *(p + i); *(p + i) = *(p + n - i - 1); *(p + n - i - 1) = temp;//注意 }}int main(){ int a[10] = { 3,7,9,11,0,6,7,5,4,2 }, i,*p=a;inv(p,10);for (i = 0; i < 10; i++) printf("%d ", *p++);return 0;}
用指针方法对10个整数按由小到大顺序排序
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#define N 100void sort(int*p, int n){ int i, j, temp, k;//注意定义temp,而不是*temp; for (i = 0; i < n - 1; i++)//注意i,j的范围 { k = i; for (j = i + 1; j < n; j++) if (*(p + k) < *(p + j)) { temp = *(p + k); *(p + k) = *(p + j); *(p + j) = temp; } }}int main(){ int a[N], *p = a, i=0, n=0; do { scanf("%d", p + i);///******* i++; ///******* } while ((getchar()) != '\n');///*******注意在输入元素时,并不知道输入的个数,可以通过检验空格是否为回车而检验 /////////////////////////////////////是否输入结束,并计数 n = i;//元素的总数 sort(p, n); for (i = 0; i < n; i++) printf("%d ", *(p + i)); return 0;}
通过指针引用多维数组
在二维数组中a[10][5],其中a[0]只是一个地址并不是某个元素的值。
a,a+i,a[2],(a+i), (a+i)+j,a[i]+j,都是地址
*(a+i)等价于a[i]
**int (*P)[4]=a,p+1一次跳4个
int*p=a[0];一次跳一个**
指向多维数组元素的指针变量
有一个3*4二维数组,用轴向元素的指针变量输出二维数组的各个元素
方法一
**#define _CRT_SECURE_NO_WARNINGS****#include<stdio.h>**int main(){ int a[3][4],m; int(*p)[4]=a;//int(*p)[4]表示p为一个指针变量,他指向**包含4个整型元素的一维数组**,注意括号必不少 //[]的级别高,所以必须加括号。 int i, j,s,t; for (i = 0; i < 3; i++) { for (j = 0; j < 4; j++) { scanf("%d", (*(p + i) + j)); } } for (i = 0; i < 3; i++) { for (j = 0; j < 4; j++) { printf("%d ", *(*(p + i) + j)); } printf("\n"); } scanf("%d%d", &s, &t); m = *(*(p + s) + t); printf("%d\n", m);return 0; }
方法二
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>int main(){int a[3][4], i, j, *p = a[0];//一次跳一个,指针指向数组元素for (p = a[0]; p < a[0] + 12; p++)//不可以p<p+12;因为p一直在变 scanf("%d", p);for (p = a[0]; p < a[0] + 12; p++)//不可以p<p+12;因为p一直在变{ printf("%d ", *p); if ((p+1 - a[0])%4 == 0)//四个一行 printf("\n");}scanf("%d%d", &i, &j);printf("%d", *(a[0] + i * 4 + j));//一次跳一个return 0;}
#include<stdio.h>int main(){int a[4]={1,3,5,7};int(*p)[4];p=&a;printf("%d\n",(*p)[3]);return 0;
以上程序中p=&a;表示p指向一维数组(行),(*p)[3]表示指向的行中的序号为三的元素。若p=a,则表示p的值为&a[0],指向a[0]
int(p)[4]的类型为int()[4]
用指向数组的指针作函数参数:
两种方法:①指向变量的指针 形参void sss(int*p);实参sss(*arr)
②指向一维数组的指针void sss(int(*p)[4]) 实参sss(p)
一个班三人四课计算总平均分以及第n个学生的成绩。
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>void average(int(*p)[4], int i, int j)//注意只有两种形式{ float ave[4] = { 0 }, *q = ave;//数组初始化需要带花括号{},不能直接写ave[4]=0; int n = 0; for (i = 0; i < 3; i++) { for (j = 0; j < 4; j++) { if (*(*(p + i) + j) < 60) n++; (*(q + i)) = *(*(p + i) + j) + (*(q + i));//不要搞混 } if (n >= 2) { printf("第%d个学生有一门以上课程不及格\n", i + 1); for (j = 0; j < 4; j++) printf("%d ", *(*(p + i ) + j)); printf("\n"); } (*(q + 3)) = (*(q + i)) + (*(q + 3)); } printf("总平均分为:%.2f\n", ((*(q + 3)) / 12));//注意应该除以12 for (i = 0; i < 3; i++) printf("第%d个学生的平均分为:%.2f\n", i + 1, (*(q + i)) / 4);}int main(){ int score[3][4], (*p)[4] = score, i, j, n; for (i = 0; i < 3; i++) { for (j = 0; j < 4; j++) scanf("%d", *(p + i) + j); } average(p, 3, 4); printf("查找第几个学生:\n"); scanf("%d", &n); printf("第%d个学生的成绩为:", n); for (i = 0; i < 4; i++) printf("%d ", *(*(p + n - 1) + i)); printf("\n"); return 0;}`
用指针引用字符串
字符串的引用方式
#include<stdio.h>int main(){char*string="I love China";//注意是双引号 printf("%s",string); printf("%c",*(string+7));//注意 return 0;
复制
法一:
#include<stdio.h>int main(){ char a[] = "kk and wenwen", b[20]; int i; for (i = 0; *(a + i) != '\0'; i++) *(b + i) = *(a + i); *(b + i) = '\0';//因漏下而出错,循环只有在不是回车的时候才复制,所以需要重新写一行 printf("%s\n", a); printf("%s", b); return 0;}
指针法
见指针(二)
0 0
- 指针(一)
- 指针(一)(基本概念)
- 指针(一)
- 指针(一)
- 指针(一)
- 指针(一)
- 指针(一)
- C++指针(一)
- 指针进阶(一)
- 模拟指针(一)
- 指针基础知识(一)
- 指针学习(一)
- 学习指针(一)
- 指针入门(一)
- 关于指针(一)
- 指针(一)
- 指针(一)
- C++指针(一)
- Android Studio Error:Could not find com.android.tools.build:gradle
- Log4J日志配置详解
- 信号signal()、alarm()、信号集函数、sigprocmask()
- 关于SimpleDateFormat安全的时间格式化线程安全问题
- Integer的自动拆箱和自动装箱的陷阱(整型数-128到127的值比较问题)
- 指针(一)
- (HDU 1259) 最少拦截系统 dp || 贪心
- javascript 普通对象和集合类的操作学习笔记
- 个人银行账户管理程序实例
- Ifram中父页面调用子页面的实现方法
- spring的启动过程——spring和springMVC父子容器的原理
- 数据中心性能指标采集及汇总需求开发经验
- Java正则表达式
- acdream1221Little Jumper+三分