指针的运算补充
1. int st[5]={5,7,1,8,9};
int p=st;
p++
(p)++
(p++)
++p
(++p)
++p
++(p)
2.const修饰变量和指针
const:常量化
1)const修饰变量,将变量进行常量化。
const修饰变量,变量的值不能通过变量名进行修改,但是可以通过指针对变量存放的值进行修改。
2)const修饰指针
const int *p
指针指向可以更改,指针指向的内容不能通过指针修改。
int * const p
指针的指向不能更改,指针指向的内容可以通过指针修改。
const int * const p
指针的指向不能更改,指针指向的内容也不能通过指针修改。
3.void 修饰指针
void 类型的指针————》void 类型的指针可以匹配任意类型的地址,使用时需要强转为对应地址类型。
(在通过void 型的指针访问地址对应内容时需要进行强转)
补充:数据类型的强转(使用时常进行隐式强转)
格式:(数据类型)变量 ————》将变量强转为对应类型
隐式强转:一般会被强转为精度最高的类型。
eg:
int a;
char b;
float c;
double d;
a+b+c+d 的结果不考虑赋值问题,结果为什么类型?double
指针类型的强转:(指针类型)指针变量
*测试大小端:(笔试题)
大端:低地址存放高字节,高地址存放低字节
小端:低地址存放低字节,高地址存放高字节
数组指针:
本质是指针
概念:指向数组的指针。
格式:
[存储类型] 数据类型 (*指针变量名)[下标];
下标:跨越的维度。
int st[2][3],b[5][3];
int (p)[3];//定义了一个可以指向三个int型空间大小的指针p;
p=st;
p=b;
p++;//p=p+1;
int arr[3][5];
int (pp)[5];
pp=arr;
int a[4]={7,8,9,10};
int (sp)[4]=&a;//&a:整个一维数组的地址
数组指针和二维数组结合间接访问二维数组:
1)直接访问元素
p[i][j] ((p+i)+j) (p[i]+j)
2)直接访问元素地址
&p[i][j] *(p+i)+j p[i]+j
指针数组:
本质是数组
概念:本质是数组,元素是地址。
格式:
[存储类型] 数据类型 *指针数组变量名[下标];
下标:是元素个数。
举例:int a=10,b=12,c=15;
int p[3]={&a,&b,&c};//p[0]=&a p[1]=&b p[2]=&c
for(i=0;i<3;i++)
{
printf(“%d “,p[i]);
}//10 12 15
一维数组的数组名是一维数组的首地址。
p———>&p[0]
p相当于是二级指针。
int sp=p;
指针数组和二维数组结合:*
int st[2][3]={1,2,3,4,5,6};
int p[2]={st[0],st[1]};// p[0]=st[0] p[1]=st[1];
p[0][0]==>1 p[1][0]==>4<br /> p[0][1]==>2 p[1][1]==>5<br /> <br /> *p[0] -->1 *p[1]=4<br /> *(p[0]+1)-->2 *(p[1]+1)=5<br /> <br /> p-->&p[0] p+1=&p[1]<br /> *p=p[0]=st[0] *(p+1)=p[1]=st[1]<br /> **p=*p[0]=*st[0]==>1 **(p+1)=*p[1]=*st[1]=4<br /> <br /> *p+1=p[0]+1=st[0]+1 *(p+1)+1=p[1]+1=st[1]+1<br /> *(*p+1)=*(p[0]+1)==>2 *(*(p+1)+1)=5<br />
int a[3];int *q=a; -->q[0]=a[0] <br />
命令行参数
/char p=”hello”;
定义一个char 型的指针可以指向一个字符串常量,
这个字符串常量是不能通过指针更改值。只能通过拿到字符串
常量的地址使用这个字符串。
定义的指针(局部),存放在栈区,而字符串常量存放在静态区
的.ro区(常量区)。
/
char sp[]={“hello”,”world”,”welcome”};
sp[0]=”hello” sp[1]=”world” sp[2]=”welcome”
int main(int argc,const char argv[])
argc:命令行参数个数
argv:命令行参数的内容
argv[0]—>可执行程序
函数
三要素:功能、参数、返回值
概念:函数是独立的功能代码模块。
格式:
[存储类型] 数据类型 函数名(形参列表)
{
功能代码块;
return 常量/变量/表达式;
}
常量/变量/表达式的类型需要和函数的数据类型保持一致。
当函数不需要返回值,函数类型为void类型,return语句可以没有。
当定义的函数不需要传参,形参列表写成void,若不写void,
调用函数时,传递实参不会报错,但是传递的值会占用资源,
浪费资源同时可能会导致代码出现问题且找不出错误原因。
举例:我给你两个int型的值,函数进行求和,然后将求和的结果给我。
函数的声明:[存储类型] 数据类型 函数名(形参列表);
函数的调用:函数名(实参);
1.不需要接收返回值和不需要传参:
函数名();
2.需要接收返回值和不需要传参:
调用函数时定义一个返回值类型的变量接收返回的值。
变量=函数名();
3.不需要接收返回值和需要传参:
函数名(实参);
4.需要接收返回值和需要传参:
调用函数时定义一个返回值类型的变量接收返回的值。
变量=函数名(实参);