可以p=a;
i加1循环输出*(p+i);
或者可以
for(p=a;p
或者可以
for(p=a;p
输出*p++等价于*(p++)
用指针变量作函数参数接收数组地址
当用函数调用时用数组名和数组的个数做为函数的实参,因为传递的是数组的首地址,所以用指针做为函数的形参,可以接收从实参传递过来的数组首元素的地址。此时p=a;就可以用*(p+i)来操作数组中的元素。
实参与形参的几中情况 实参 形参
数组名 数组名 数组名 指针变量
指针变量 数组名 指针变量 指针变量 //注意:(1)实参数组名a是个常量,或者说是指针型常量,不能改变a的值,如a++错误 而形参数组名a是个指针变量,不是一个固定的地址值,它的值可以改变。在函数调用开始时,它接收了实参数组的首地址,在函 数执行期间,它可以再被赋值。
(2)当是第一种情况时,实参与形参都是数组名时,实质就是把实参的数组首地址赋给了形参作为首地址,实质操作的是同一 数组,而用二个名子。
多维数组
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};--------a[i][j]=*(a[i]+j)=*(*(a+i)+j) 方法一:
int *p;p=a[0]; 循环条件p
二维数组的首行是指向一个一维数组,a[0] 代表&a[0][0],而a代表的是&a[0]
并且p定义成int *类型, 如赋值成a,是p应是一个二级指针(即指向地址的指针) /如令循环初始值p=a;循环条件p
int (*p)[4];p=a;输出*(*(p+i)+j);// 即输出的是第i行j列的元素,ij都是从0开始 定义p是指向一个int []的指针,p=a;代表p=&a[0];而p+1则表示的是&a[1],即p指向了下一个一维数组。
而*(p+1)就是a[1],a[1]又表示&a[1][0]; ,所以(*(*(p+i)+j)=*(&a[i][0]+j)即得到每个元素
注意:int *p[4]; int (*p)[4]; 因为下标[]的运算级别高于*,所以前者先p[4]表示p是个数组,每个元素是个int *;即p是一个int *型的数组
后者*p先结合表示p是个指针,再与[]结合,表示p是个指向int [4]的指针
用指向一维数组的指针作为函数的参数,可以输出二维数组int a[3][4]的各个元素
即int (*p)[4]作为形参,实参是一维数组的地址a,或&a[0],然后用i,j分别控制双重循环,输出*(*(p+i)+j)
重点:*(*(p+i)+j)=*(a[i]+j)=*(&a[i][0]+j)
字符串的存放有四种方法
(1)可以用字符数组,char str[]=\(2)可以用字符串变量,string str=\
(3)可以用字符指针指向一个字符串,char *str=\可以直接把一个字符串的常量赋值组一个字符型指针变量,实质是把字符串的每一个元素的地址赋给了str;
(4)可以先用字符数组定义一个字符串,再用字符指针指向这个字符数组 即char s[]=\love C++!\
四种方法都可以将整个字符串一次性输出cout< 字符串的存取方法(下面完成一个将串str1复制到str2的例 子) (1)下标法与指针法相结合 char str1=\ char str2[20]; char *p1=str1,*p2=str2; for(;*p1!='\\0';) *p2++=*p1++; 注意cout< string str1=\ string str2; str2=str1; cout直接输出str1,str2就可以了。 函数的指针:一个函数在编译的时候分配给一个入口地址,这个函数入口地址就称为函数的指针。可以用一个指针变量指向函数,然后通 过该指针变量调用此函数。 定义函数的指针变量的方法: int (*p)(int,int);-------函数类型 (*指针变量名)(函数形参表); 可见p是一个指针,指向int(int,int)的函数,就是说p是一个指向返回值为int,两个形参也为int类型函数的指针 区别于指针函数int *p(int,int)------即返回值是指针的函数 因为 ()的优先级高于*,所以p与()先结合,说明p是一个函数再与int *结合说明p是一个返回值是int *的函数 用函数指针变量调用函数方法: int (*p)(int,int);//定义函数指针 p=max;//让p指向函数max(这里的函数名代表的是函数的入口地址,而若写成max(a,b)则成了函数调用) int m=p(a,b);//通过函数指针调用max(a,b);等价于int m=max(a,b); 当然前提是有个int max(int,int);的子函数; 注意:*p就是函数调用 用指向函数的指针作为函数的参数思想是: 把函数名作为实参传给其他函数的形参,这样就可以在调用一个函数的过程中根据给定的不同实参调用不同的函数 如int f(int a,int b ,int (*p)(int)) 分别编写几个函数f1,f2,f3;通过函数指针分别指向f1,f2,f3,,然后调用f()三次,就可以实现在一个函数中完成不同的功能 返回值是指针的函数 如int *f(int,int)-------类型名 *函数名(参数列表); 指针数组: char *p[];-------------- ********************************************************************************************** *********************2010年09月06日 星期一 09时38分43秒 (第四天)*********************************** 操作符 &:取地址符,(八位十六进制数表示)一般越先定义的变量地址越大,因为用到栈.变量不一定按顺序存放,有预留的空间, *:可以通过地址找变量 *号与&是同一级别,但运算自右向左结合 如*&n:取的是n的值,也可以*&n=67;重新给n赋值 若 &*n没有意义 强制类型转换 char c='a' (int)c=97 等价int(c)=97 int i=65 (char)i='A' 等价char(i)='A' double d=234.56 (int)d=234 等价int (d)=234(注意是截取,不是四舍五入) int i=-1, (unsigned)i=很大的一个数 位运算:<< >> & | ^ ~ << >>:不得超过类型的总位数,如int型共4个字节,最多位移31位 <<左移:右边补0 >>右移:对于非负补0,可正可负补符号位 或者说: 对负数补1,非负数补0 &按位与:两个数的二进制数各个位按位相与(只有全为真才为真,相当于乘法) 例:可以把某一位置0:因为任何位数与1相与都是它本身,即1&1=1,0与1=0,而0&0=0 1&0=0 |按位或:各个位相或(有一个为真则为真,,) 例:可以把某一位置1,因为0|0=0,1或0=1,而1|1=1。0或1=1 ^按位异或:各个位异或(相同则为0,不同则为1,相当于加法) 例 :1跟谁异或就给谁取反,如0^1=1, 1^1=0 &&逻辑与:(而且) 短路运算问题: 如&&前为假,后面就不作运算判断,结果直接为假 如:卡号有效&& 密码正确&& 取款金额<=存款额 ||逻辑或:(或者) 短路运算问题: 如||前为真,后面就不作运算判断,结果真接为真 有时会出现错误 如a++>5||b++<10,当a++大于5后,b就没有++,所以要避开这种写法 条件运算:-----三目运算符,(高于赋值运算符,逗号运算符) 表达式1)?表达式2:表达式3 当表达式1为真,计算执行表达式2,为假,计算执行表达式3(可见也存在短路问题) 经典例题: int a=10,b=10,c=10; cout< cout<<(a++>5||b++>6||c++>7)< cout<<\结果 a=11b=10c=10 cout<<(a++<5&&b++<6&&c++<7)< cout<<\结果 a=12b=10c=10 上面是短路问题:||前如果为真,后面的不做计算,结果真接为真 所以只执行了a++ &&前面的为假,后面的不做计算,结果真接为假,所以只执行了a++ 另外,cout< ,逗号运算符-------双目运算符,运算级别最低。(结果等于最后一个表达式) 如(a=3*5,a*4),a+5 先a=15,再a*4=60,再15+5=20(因为a=15) 逗号表达式最终结果=20 注意:++ -- =会改变变量的值,其它运算符会有一个空间保存临时结果 goto 标签名1; IBM取款机流程:循环 插卡(判断是不是无效卡) ,输密码(反复三次) 循环:菜单选择(分支){1 查 剩额 2 取款 3 存款 4 退出 } 输金额 取钞 if---else经典:闰年的判断:if((y%4==0&&y0!=0)||(y@0==0)) isleap=true; else isleap=false switch语句 while语句 作业:1、从键盘输入一个班所有同学的成绩,-1表示输入结束。请统计这个班的最高成绩,最低成绩,平均成绩(最好用dowhile) 2、从键盘输入一个整数,输出它的中文读法(如3906:叁仟玖佰零陆) 如10035 3、超市只有50、20、10、5、2、1(单位:元)、面额的钞票,从銉盘输入需要找的钱数,输出找车钱的最佳方案。(就是钞票数最少的) *********************2010年09月07日 星期二 09时43分00秒 (第五天)*********************************** 循环:也叫迭代,反复 标志名:代码行 while(true) { 这是一个死循环 ,不过是假的 if(条件) break;(只跳出一层循环) goto 标志名;(可以通过设置标志用goto跳出多层循环) } for(;;){ for无限循环比while效率还高,因为不做判断