day1.指针
1.内存与指针
内存中每个字节有一个编号-----地址,编译或函数调用时为其分配内存单元
2.指针和指针变量
指针:一个变量的地址
指针变量:指针变量必须在使用前赋值!!!专门存放变量地址的变量*p的核心是取地址的值,P是地址。在C中int *p=0; int *p=NULL这两个是等价的。要让指针变量确切地指向某个变量,需要使用&取地址操作符。在声明指针后,不初始化的后果可能会造成各种内存错误。
指针定义:在给P赋值的时候,开辟了内存来存放地址,所以*P的地址是另一个。
3.直接访问与间接访问
i=3 直接访问
*i_pointer=20 间接访问
4.空指针:
定义:指针变量值为0,表示:int *p=0,p指向地址为0的单元,系统保证该单元不做他用表示指针变量值没有意义。用途是避免指针变量的非法引用,在程序中常作为状态比较
day2
1.指向指针的指针
指针变量也是变量,占据一定的内存空间,有自己的地址,因此可以用一个指针指向它。
可以用“**”声明一个二级指针
例如:
int num;
int *p=# 这是取变量地址给指针赋值
int **p=&p;
2.“指针变量的值”是指指针本身存储的数值,这个值将被编译器当做一个地址,不是一般的数值。
1.指针的运算
p=&a; (将变量a地址赋给p)
p=array; (数组array首地址赋给p)
p=&array[1];(将数字元素地址赋给p)
p1=p2; (指针变量p2的值赋给p1)
不能把一个整数赋给P,也不能把p的值赋给整型变量
2.指针的算术运
使用递增/递减运算符(++,--)将指针递增或递减
一个类型为T的指针的移动以sizeof(T)为移动单位
3.指针比较
指针比较就是看两个指针是否指向同一个地址
如果两个指针所指向的元素位于同一个数组,指针的大小比较反映了元素在数组中的先后关系
4.若有p=a(p指向数组a),则:
p++(或p+=1),表示p指向下一个元素。
*p++与*(p++)等价。同样优先级,结合方向自左向右。
*(p++)与*(++p)前者是先取*p的值,后使p值加1,相当于a[i++];后者是先使p加1,再取*p,相当于a[++i.]
(*p)++表示p所指向的元素值加1,而不是指针值加1
day3
1
1.数组与指针:指向数组元素的指针变量
数组名是表示数组首地址的地址常量
注意:数组名不代表整个数组,只代表数组首元素的地址。"p=a"的作用是“把a数组的首元素的地址赋给指针变量p”,
而不是“吧数组a各元素的值赋给P”
2.数组元素表示方法
变址运算符ai<==>*(a+i)
a[i]<==>p[i]<==>*(p+i)<==>*(a+i)
3.数组引用多维数组
多维数组元素的地址
int a [3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
a a[0] a[0]+1 a[0]+2 a[0]+2
a+1
a+2
这三个是行指针 这四个是列指针
行指针每加1 走一行 列指针每加1 走一列
a+i代表行号为I的行首地址(按行变化)*(a+i)相当于a[i
a[i]+j代表a[i[[j]的地址
*(a[i]+j)代表a[i[[j]的地址
*(*(a+i)+j)与*(a[i]+j)等价
2
1.数组作为函数的参数
用指向数组的指针作函数参数
一维数组,多维数组都可以作为函数参数
用指针变量作为形参,接受实参组名传递来的地址
两种方法:一种是一位数组用指向变量的指针变量,另一种是二维数组用指向一位数组的指针变量
2.数组名作函数参数是指针
实参数组名是指针变量,但是形参数组名是按指针变量处理,在函数执行期间,形参数组可以再被赋值
void fun(arr[],int n)
{printf("%d\n",*arr);
arr=arr+3;
printf("%d\n",*arr)'
}
3.函数指针
1
在程序中定义一个函数,编译的时候,编译系统为函数代码分配一段存储空间,这个存储空间的起始地址被称为这个函数的指针
可以定义一个指向函数的指针变量,用来存放某一函数的起始地址,这就意味着此指针变量指向该函数。例如int(*p)(int,int)'
定义p是指向函数的指针变量,它可以指向类型为整型且有两个整形参数的函数。p的类型可以用int(*)(int,int)表示
定义指向 函数的指针变量的一般形式为数据类型(*指针变量名)(函数参数表列);
如 int(*p)(int,int);p
p=max; 对的
p+max(a,b); 错的
2,
指向函数的指针变量的一个重要用途是把函数的地址作为参数传递到其它函数
指向函数的指针可以作为函数参数,把函数的入口地址传递给形参,这样就能够在被调用的函数中使用形参函数
3
一个函数可以返回一个整型值,字符值,实型值等,也可以返回指针的数据,即地址。其类型与以前类似,只是返回的值的类型是指针类型而已
定义返回指针值的函数的一般形式为 类型名*函数名(参数列表);
4指针表达式与左值
int num 1=0,num2=0;
int *p=&num1;
p=&num2;
*p=1;
指针变量可以作左值,并不是因为他们是指针,而是因为他们是变量。
day4
字符串以及字符串操作
1.C语言中没有提供“字符型“这个特定类型,是以特殊字符数组的形式来存储和处理字符串,必须以空字符‘\0'结尾
比如char a[5]="a,b,c,d,e",因为结尾是空字符’\0',所以会报错,如果把5改成6就可以通过编译。
定义形式:char 数组名【常量表达式】
如果初始化时初值个数小于数组长度,系统会为剩余元素自动赋值为‘\0'
2字符指针输出字符
main()
{char *string="i love china";
printf("%s",string);
string+=7 把指针移动到第七个元素的地址
while(*string)
{putchar(syring[0]);
string++
}
}
第一个输出i love china,第二个输出china
3.字符数组的定义和初始化
一维char c[100]="akujfh";
char c[100]={"siauhdiashsdi"};
二维char a[10][10]={{asd},{asfhyo},{a;soofu}}
char [10][10]={klhhas,aksjhg,askh}
4.字符数组的输入输出
字符指针变量与字符数组
char *cp; 与char str[20];
str由若干元素组成,每个元素放一个字符,cp中存放字符串首地址
char str[20]; str="i love china";这种形式是错误的
char *cp; cp="i love china"\
str是地址常量;cp是地址变量
cp接受键入字符串时,必须先开辟存储空间。
5.字符串与字符数组的关系
char str[]={"hlei"};
char str[="lei";
char str[]={"q','e'};
char *cp ="hkh";
int a[]={1,2,12};
int *p={1,2,3,};这种是错误的以上都是对的
6.相关输入输出函数处理字符串
常用的是scanf输入,printf输出
在linux中可以用fgets (ch,100,stdin)这样输出数组比较轻松
字符串处理函数有
字符串赋值函数strcpy
字符串比较函数strcmp
字符串全部转大写strupr
在学习JS的时候我做过一道题目,一对兔子,生长周期为3个月,之后每一个月可以生下一只兔子,30个月以后一共有多少兔子现在学了C,发现几行代码就搞定了。
int i = 1;
int k =0;
int j = 1;
int a =2;
while(a<30){
k = i+j;
i = j;
j =k;
a++;
}
printf("%d",j)