表达式 | 运算 | 表达式的值 | 含义 |
---|---|---|---|
a++ | 给a+1 | a原来的值 | 先输出a的值再进行自加 |
++a | 给a+1 | a+1以后的值 | 先自加再输出a的值 |
goto 标志;
标志:#程序某处设置标志,跳到标志所在的地方去,
//
在循环最内层要跳到最外层用,其他情况尽量不用。
if(exp1)
stl;
else if(exp2)
st2;
else
st3;
#include
void sum(int begin,int end);//函数声明,也可以void sum(int,int)但对于人类来说这样不是很容易理解。
int main()
{
sum(1,10);
return 0
}
void sum(int begin,int end)//函数的定义
{
int i;
int sum=0;
for (i=begin;i<=end;i++){
sum+=i;
}
printf("%d到%d的和是%d\n",begin,end,sum);
}
/*错误写法,并不能真正做到交换
int swap(int x,int y)
{
int t;
t=x;
x=y;
y=c;
printf("%d,%d",x,y)
}
*/
int swap(int *x,int *y)//正确写法
{
int t;
t=*x;
*x=*y;
*y=c;
printf("%d,%d",*x,*y)
}
scanf("%d",&board[i][j])
int a[] [5]={//也可以不带大括号当一维数组初始化,但这种方式使人类更便于阅读
{0,1,2,3,4},
{2,3,4,5,6},
};
board[i][size-i-1]
反对角线上的元素sizeof(a)/sizeof(a[0])
为数组元素数量。int serach(int key,int a[ ],int length)
{
//具体内容
}
//使用两个数组的方式,输入一定金额,查找并输出对应单位
//但这种方式并不好,割裂的两个数组对于catch是不友好的
int amount[]={1,5,10,25,50};
char *name[]={"penny","nickel","dime","quarter","half-dollar"};//指针形式的数组
int serach(int key,int a[],int len)
{
int ret=-1;
for(int i=0;i<len;i++)
{
if(key==a[i])
{
ret=i;
break;
}
}
return ret;
}
int main()
{
int k=10;
int r=serach(10,amount,sizeof(amount)/sizeof(amount[0]));
if(r>-1)
{
printf("%s\n",name[r]);
}
return 0;
}
//输入一定金额,查找并输出对应单位,使用结构的方式
int amount[]={1,5,10,25,50};
char *name[]={"penny","nickel","dime","quarter","half-dollar"};//指针形式的数组
struct{
int amount;
char *name;
}coins[]={
{1,"penny"},
{5,"nickel"},
{10,"dime"},
{25,"quarter"},
{50,"half-dollar"}
};
int serach(int key,int a[],int len)
{
int ret=-1;
for(int i=0;i<len;i++)
{
if(key==a[i])
{
ret=i;
break;
}
}
return ret;
}
int main()
{
int k=10;
for(int i=0;i<sizeof(coins)/sizeof(coins[0]);i++)
{
if(k==coins[i].amount){
printf("%s\n",coins[i].name);
break;
}
}
return 0;
}
//一定要是有序的,才能进行二分查找
//本段代码演示从小到大排序的情况
int serach(int key,int a[],int len)
{
int left=0;
int right=len-1;
int ret=-1;//表示没找到
while (right>left)//当不满足时,表示全都找了
{
int mid=(left+right)/2;
if(a[mid]==k)
{
ret=mid;//找到的就在ret下标处
break;
}
else if(a[mid]>k)
{
right=mid-1;
}
else
{
left=mid+1;
}
}
return ret;
}
//找出最大的值的下标
int max(int a[],int len)
{
int maxid=0;
for(int i=1;i<len;i++)
{
if(a[i]>a[maxid])
{
maxid=i;
}
}
return maxid;//返回最大值下标
}
int main()
{
int a[]={2,45,6,12,87,34,90,24,23,11,65};
int len=sizeof(a)/sizeof(a[0]);
//做交换,将最大的与最后一位交换
for(int i=len-1; i>0;i--)
{
int maxid=max(a,i+1);
//swap a[maxid],a[len-1]
int t=a[maxid];
a[maxid]=a[i];
a[i]=t;
}
//遍历输出数组
for (int i=0;i<len;i++)
{
printf("%d ",a[i]);
}
return 0;
}
指针中的值放的都是别的变量的地址
&是取地址运算符,作用是获得变量的地址
,它的操作数必须是变量,不能对没有地址的取地址
int i=0;printf("%p\n",&i)
得到变量i的地址,以对应正确格式输出
地址的大小是否与int相同取决于编译器是32位架构还是64位
c中内存是以堆栈stack存储,自顶向下形式,先定义的在高位。
相邻地址间差距为4,取数组a地址时,a=&a=a[0],这几种形式取出的都是a[0]的地址
将变量的地址传给函数,能否通过地址访问变量?–可以,指针
用参数表达别的参数的地址,如何表达能保存地址的变量?----指针
*单目运算符,用来访问指针的值所表示的在那个地址上的变量,即用来取出这个指针所指地址处的值
int i=5;
int*p=&i;//*表示p是指针(本质还是变量),指向的是一个int,将i的地址交给指针p
printf("*p=%d\n",*p);//输出*p=5
//*p是个int
//p指向i的意思是,即p指向i变量的地址,*P的值就是i地址所对应的值即i的值
int *p,q;//p是指针,而q只是普通变量,
int *p,*q;//p,q都是指针
void f(int*p);//函数的参数是指针
int i=0;
f(&i);//调用时的参数应该是取得的某个变量的地址
//在函数里可以通过这个指针访问外面的这个i
int i=6;
void g(int k)//函数里拿到的仅是值
g(i);//仅得到值6,与外面的变量i没有关系
int j=*p;//p所表示的地址上的变量值赋给j
int i=6;
f(&i);
void f(int *p)//也是值的传递,只是这种指针方式传入了地址
{
printf("*p=%d\n",k)//此步输出*p=6
*p=28//若此时再输出i的值,发现i的值也变为28
//此时函数内的*p就代表了i,改*p即改了i
//若是没有*将地址传入则仅值传递,发生的仅此处值改变,而外面的变量值仍不变
}
int i=2;
int*p=&i;
printf("i的地址&i=%p\n",&i);//输出结果0060FF0C
printf("p的值=%p\n",p);//输出结果0060FF0C
printf("p的地址&p=%p\n",&p);//输出结果0060FF08,这个地址是指针的地址
*p=28;
printf("更改p后i的值i=%d",i);//值为28,此时修改指针的值也就修改了i的值
return 0;
函数参数表中的数组实际上是指针
在函数里用sizeof(a),计算的不是数组a的长度
,而是指针的长度即sizeof(int*)数组变量本身表达地址,所以无需&
即可取其地址
数组的单元表达的是变量,需要&取地址
数组变量是const的指针,所以不能被赋值
//a是一个数组,且在数组变量与指针这一节中都这么表示
int b[]=a;//错误,不可以这样,此处int b[]即int*const b
int *q=a;//可以这样写
printf("小写转大写%c\n",'a'-('a'-'A'));
printf("大写转小写%c\n",'A'+('a'-'A'));
不需要修改字符串的情况下,指针定义的无法修改
要构造一个字符串用数组,要处理一个字符串用指针
char string[8];
scanf("%s",string);//不安全,可能超过8
scanf("%7s",string);//安全,告诉函数最多只能读7个字符,超过7个就不要了
//这样就不是根据空格来划分单词而是根据个数来。若定义了两个字符串,两次读入,则多余的给下一个scanf阅读
printf("%s",string);
比较
返回0(相等)、1(s1>s2)、-1(s1
拷贝
存在安全问题可能越界
链接
,存在安全问题可能越界
字符串中找字符串