指针
运算符&
scanf("%d", &i)里的&
1.获得变量的地址,它的操作数必须是变量
int i;printf("%x", &i)
2.地址的大小是否与int相同取决于编译器
int i;printf("%p",&i);
3.&不能对没有地址的东西取地址,例:&(a+b)&(a++)&(++a)
指针
指针就是保存地址的变量
地址运算符:*
*后跟一个指针名或地址时,*给出储存在指针指向地址上的值
int *p→p是指向int类型的指针
指针变量
1.普通变量的值是实际的值
2.指针变量的值是具有实际值的变量的地址
指针应用场景
1.交换两个变量的值
void swap(int *pa, int *pb)
{
int t = *pa;
*pa = *pb;
*pb = t;
}
2.1)函数返回多个值,某些值就只能通过指针返回
2)函数返回运算的状态,结果通过指针返回
指针最常见的错误:定义了指针变量,还没有指向任何变量就开始使用指针
数组参数
以下四种函数原型是等价的:
1.int sum(int *ar,int n);
2.int sum(int *,int);
3.int sum(int ar[],int n);
4.int sum(int [],int);
数组变量是特殊的指针
1.数组变量本身表达地址
int a[10];int *p=a;→无需用&取地址,但是数组的单元表达的变量需要用&取地址(a == &a[0])
2.[]和*运算符可以对数组做,也可以对指针做
3.数组变量是const的指针所以不能被赋值
指针与const(只适用于C99)
1.指针是const
表示一旦得到了某个变量的地址,不能在指向其他变量
int *const q = &i→q是const,所以(*q=26;√),(q++;×)
2.所指是const
表示不能通过这个指针去修改那个变量
const int *p = &i;→(*p = 26;×)(i = 26; p = &j;√)
为了保护数组不被函数破坏,可以设置参数为const
求n个自然数的平均值
#include <stdio.h>
int main()
{
float i,n,m;
scanf("%f", &n);
float sum = 0;
for ( i=0;i<=n;i++ ) {
sum = sum + i;
}
m = sum/i;
printf("%f",m);
return 0;
}
按照格式打印n行由“*”组成的三角形。
例如:当n=3时,***
**
*
#include <stdio.h>
int main()
{
int i,j,n;
scanf("%d",&n);
for(i=1;i<=n;i++) {
for(j=0;j<i-1;j++) {
printf(" ");
}
for(j=n;j>=i;j--) {
printf("*");
}
printf("\n");
}
return 0;
}