C语言程序设计-笔记7-指针
C语言程序设计-笔记7-指针
例8-1 利用指针模拟密码开锁游戏。
#include<stdio.h>
int main(void)
{
int x=5342; //变量x用于存放密码值
int *p=NULL;
p=&x;
printf("If I know the name of the variable,\
I can get it's value by name:%d\n",x);
printf("If I know the address of the variable "
"is:%x,then I also can get it's value by address:%d\n",p,*p);
return 0;
}
注:printf换行的2种方式:\和””
例8-2 取地址运算和间接访问运算示例。
#include<stdio.h>
int main(void)
{
int a=3,*p,x;
p=&a;
printf("a=%d,*p=%d\n",a,*p);
*p=10;
printf("a=%d,*p=%d\n",a,*p);
printf("Enter a:");
//scanf("%d",&a);
printf("a=%d,*p=%d\n",a,*p);
(*p)++;
printf("*a=%d,*p=%d\n",a,*p);
x=*p++;
printf("*a=%d,x=%d,*p=%d\n",a,x,*p);
printf("&a=%x,p=%x\n",&a,p);
return 0;
}
例8-3 角色互换。有两个角色分别用变量a和b表示。为了实现角色互换,现制定了3套方案,通过函数调用来交换变量a和b的值,即swap1()、swap2()和swap3()。请分析这3个函数中,哪个函数可以实现这样的功能。
#include<stdio.h>
void swap1(int x,int y),swap2(int *px,int *py),swap3(int *px,int *py);
int main(void)
{
int a=1,b=2;
int *pa=&a,*pb=&b;
swap1(a,b);
printf("After calling swap1:a=%d b=%d\n",a,b);
a=1;b=2;
swap2(pa,pb);
printf("Afer calling swap2:a=%d b=%d\n",a,b);
a=1;b=2;
swap3(pa,pb);
printf("After calling swap3:a=%d b=%d\n",a,b);
return 0;
}
void swap1(int x,int y)
{
int t;
t=x;
x=y;
y=t;
}
void swap2(int *px,int *py)
{
int t;
t=*px;
*px=*py;
*py=t;
}
void swap3(int *px,int *py)
{
int *pt;
pt=px;
px=py;
py=pt;
}
例8-4 输入年份和天数,输出对应的年、月、日。要求定义和调用函数month_day(int year,int yearday,int *pmonth,int *pday),其中year是年,yearday是天数,pmonth和pday指向变量保存计算得出的月和日。例如,输入2000和61,输出2000-3-1,即2000年的第61天是3月1日。
#include<stdio.h>
void month_day(int year,int yearday,int *pmonth,int *pday);
int main(void)
{
int day,month,year,yearday;
printf("input year and yearday:");
scanf("%d%d",&year,&yearday);
month_day(year,yearday,&month,&day);
printf("%d-%d-%d\n",year,month,day);
return 0;
}
void month_day(int year,int yearday,int *pmonth,int *pday)
{
int k,leap;
int tab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}};
leap=(year%4==0 && year%100 !=0 )||year%400==0;
for(k=1;yearday>tab[leap][k];k++)
{
yearday-=tab[leap][k];
}
*pmonth=k;
*pday=yearday;
}
例8-5 冒泡排序。输入n(n10)个正整数,将它们从小到大排序后输出,要求使用冒泡排序算法。
#include<stdio.h>
#define MAXN 10
void swap(int *px,int *py);
void bubble(int a[],int n);
int main(void)
{
int n,a[MAXN];
int i;
printf("Enter n(n<=10):");
scanf("%d",&n);
printf("Enter %d integers:",n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
bubble(a,n);
printf("After sorted:");
for(i=0;i<n;i++)
{
printf("%3d",a[i]);
}
return 0;
}
void bubble(int a[],int n)
{
int i,j,t;
for(i=1;i<n;i++)
{
for(j=0;j<n-i;j++)
{
if(a[j]>=a[j+1])
{
swap(&a[j],&a[j+1]);
}
}
}
}
void swap(int *px,int *py)
{
int t;
t=*px;
*px=*py;
*py=t;
}
例8-6 输入正整数n(n),再输入n个整数作为数组元素,分别使用数组和指针来计算输出它们的和。
#include<stdio.h>
int main(void)
{
int i,n,a[10],*p;
long sum=0;
printf("Enter n(n<=10):");
scanf("%d",&n);
printf("Enter %d integers:",n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
sum=sum+*(a+i);
}
printf("calculated by array,sum=%ld\n",sum);
sum=0;
for(p=a;p<a+n;p++)
{
sum=sum+*p;
}
printf("calculated by pointer,sum=%ld\n",sum);
return 0;
}
例8-7 使用指针计算数组元素个数和数组元素的存储单元数。
#include<stdio.h>
int main(void)
{
double a[2],*p,*q;
p=&a[0];
q=p+1;
printf("%d\n",q-p);
printf("%d\n",(int)q-(int)p);
return 0;
}
例8-8 输入一个长度小于80的字符串,按规则对字符串进行压缩,输出压缩后的字符串。压缩规则是:如果某个字符x连续出现n(n1)个,则将这n个字符替换为“nx”的形式;否则保持不变。
#include<stdio.h>
#define MAXLINE 80
void zip(char *p);
int main(void)
{
char line[MAXLINE];
printf("Input the string:");
gets(line);
zip(line);
puts(line);
return 0;
}
void zip(char *p)
{
char *q=p;
int n;
while(*p!='\0')
{
n=1;
while(*p==*(p+n))
{
n++;
}
if(n>=10)
{
*q++=(n/10)+'0';
*q++=(n%10)+'0';
}
else if(n>=2)
{
*q++=n+'0';
}
*q++=*(p+n-1);
p=p+n;
}
*q='\0';
}
例8-9 找最小的字符串。输入n歌字符串,输出其中最小的字符串。
#include<stdio.h>
/*
#include<string.h>
int main(void)
{
int i,n;
char sx[80],smin[80];
scanf("%d",&n);
scanf("%s",sx);
strcpy(smin,sx);
for(i=1;i<n;i++)
{
scanf("%s",sx);
if(strcmp(sx,smin)<0)
{
strcpy(smin,sx);
}
}
printf("min is %s\n",smin);
return 0;
}*/
int main(void)
{
int i,n;
int x,min;
scanf("%d",&n);
scanf("%d",&x);
min=x;
for(i=1;i<n;i++)
{
scanf("%d",&x);
if(x<min)
{
min=x;
}
}
printf("min is %d\n",min);
return 0;
}
例8-10 先输入一个正整数n,再输入任意n个整数,计算并输出这n个整数的和。要求使用动态内存分配方法为这n个整数分配空间。
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int n,sum,i,*p;
printf("Enter n:");
scanf("%d",&n);
if((p=(int *)calloc(n,sizeof(int)))==NULL)
{
printf("Not able to allocate memory.\n");
exit(1);
}
printf("Enter %d integers:",n);
for(i=0;i<n;i++)
{
scanf("%d",p+i);
}
sum=0;
for(i=0;i<n;i++)
{
sum=sum+*(p+i);
}
printf("The sum is %d\n",sum);
free(p);
return 0;
}
C语言程序设计-笔记7-指针的更多相关文章
- 《C语言学习笔记》指针数组及其应用
C语言中,最灵活但又容易出错的莫过于指针了.而指针数组,是在C中很常见的一个应用.指针数组的意思是说,这个数组存储的所有对象都为指针.除了存储对象为指针,即一个地址外,其它操作和普通数组完全一样. # ...
- C语言学习笔记--数组指针和指针数组
C 语言中的数组有自己特定的类型,数组的类型由元素类型和数组大小共同决定.(如 int array[5]类型为 int[5]) 1.定义数组类型 C 语言中通过 typedef 为数组类型重命名:ty ...
- 【C语言学习笔记】指针
用来存放一个变量地址的变量就叫指针变量.指针变量也是有类型约束的,一般什么类型的指针指向什么类型的变量. 指针之所以叫变量,是因为它里面所存放的变量的地址也是不断变化的,指针是可以移动的. 定义格式: ...
- Go语言学习笔记(6)——指针
指 针 指针: 存储另一个变量的内存地址的变量: Go语言的取地址符号也是& 1. 声明指针: var needle_name *type var b int = 10 var a *int ...
- JAVA语言程序设计-笔记摘录
JAVA 程序语言设计(基础篇) 笔记摘录 为避免输入错误, 不要在nextByte().nextShort().nextInt()等等后面使用nextLine() nextXXXXX()都称为令牌读 ...
- C语言程序设计--字符串与指针及数组与指针
数组的基本知识 数组的定义 #define SIZE 5 int array_int[5]; //未声明初始化,默认填零 float array_float[5] = {1.01, 2.23, 3.1 ...
- C语言学习笔记--关于指针的一些小认知
int main() { int i; char *str = "hu mian yuan"; int length = strlen(str); printf("str ...
- Python语言程序设计(笔记)
1.平方根的格式化 知识点:平方根计算 pow(a,0.5)[可以计算负数,结果为复数] a**b 例题: 获得用户输入的一个整数a,计算a的平方根,保留小数点后3位,并打印输出. ...
- C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com
原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...
- Go语言学习笔记九: 指针
Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...
随机推荐
- 借助Numpy,优化Pandas的条件检索代码
Numpy其实是最早的处理数据的Python库,它的核心ndarray对象,是一个高效的n维数组结构. 通过这个库,可以高效的完成向量和矩阵运算,由于其出色的性能,很多其他的数据分析,科学计算或者机器 ...
- [Vue warn]: Unknown custom element: <el-row> - did you register the component correctly? For recursi
babel.config.js 文件中 module.exports = { presets: [ '@vue/cli-plugin-babel/preset' ] } 替换为 module.expo ...
- Java学习路线之redis
1.redis 大数据时代三V:海量Volume.多样Variety.实时Velocity 大数据时代三高:高并发.高可用(无限套娃+彼此监控).高性能 - Redis(Remote Dictiona ...
- MySQL分组数据和子查询
分组数据 创建分组 mysql> SELECT vend_id,COUNT(*) AS num_prods FROM products GROUP BY vend_id; +---------+ ...
- TensorRT C# API 项目介绍:基于C#与TensorRT部署深度学习模型
TensorRT C# API 项目介绍:基于C#与TensorRT部署深度学习模型 1. 项目介绍 NVIDIA TensorRT 是一款用于高性能深度学习推理的 SDK,包括深度学习推理优化 ...
- SQL JOIN 子句:合并多个表中相关行的完整指南
SQL JOIN JOIN子句用于基于它们之间的相关列合并来自两个或更多表的行. 让我们看一下"Orders"表的一部分选择: OrderID CustomerID OrderDa ...
- CentOS 8开启防火墙端口关闭防火墙端口端口对外放行
1:查看firewall防火墙状态 firewall-cmd --state 或者 systemctl status firewalld 2:打开防火墙 systemctl start firewal ...
- c# 优化代码的一些规则——判断null值得不同写法[六]
前言 先来看一个例子: 假设updated 是一个委托: if(updated!=null) { updated(); } 请问上面写法在多线程中安全吗?如果不安全会抛出什么异常呢? 正文 上面的答案 ...
- c# Barrier 线程回调
前言 假如现在有一个这样的需求,我一堆小黄人生产小黄丹,而大黄人要一直吃小黄丹. 如果是这样的话,想到就是一堆小黄人作为一个多线程,然后一直制造,然后另外一个大黄人一直检索是否有小黄丹,有就吃掉. 但 ...
- 跨域是什么?Vue项目中你是如何解决跨域的呢?
一.跨域是什么 跨域本质是浏览器基于同源策略的一种安全手段 同源策略(Sameoriginpolicy),是一种约定,它是浏览器最核心也最基本的安全功能 所谓同源(即指在同一个域)具有以下三个相同点 ...