Linux基本命令,vi编译器的使用,简单的编程步骤,程序语言,gcc编译器编译过程,进制转换相关知识可以查看文档http://t.csdnimg.cn/CmqhC
数值表示,词法符号,变量,常量相关知识可以查看文档http://t.csdnimg.cn/jJIe2
运算符和输表达式,输入输出相关知识可以查看文档http://t.csdnimg.cn/FJe89
控制语句,if-else,switch-case,for,while,do-while,循环控制语句相关知识可以产看文档http://t.csdnimg.cn/zskY3
一维数组,字符数组相关知识可以查看文档http://t.csdnimg.cn/1weqY
排序(冒泡排序和选择排序),二维数组相关知识可以查看文档http://t.csdnimg.cn/hvo5C
指针相关知识(概念,格式,初始化,指针运算)可以查看文档http://t.csdnimg.cn/8lop0
目录
指针补充知识:
指针修饰
1.const常量化
注意:const定义变量时必须在定义的时候就给它赋初值。
(1)修饰普通变量
修饰局部变量
const int a=10; //int const a=10;
此时a只读,不可以修改。但是可以通过指针修改。
int *p=&a;
*p=20; //可以用指针间接修改,会报警告。
修饰全局变量
放在常量区,不能通过指针修改,会报段错误
(2)修饰指针指向的内容
修饰*p,指针指向的内容不能修改,但是指针的指向可以修改。
const int *p; //int const *p;
int a = 10, b = 20;
int const *p = &a;
*p = 20;//错误,因为*p被const修饰不更更改。
p=&b; //可以通过修改指针指向
(3)修饰指针的指向
int *const p; //修饰p, 指针的指向的p不能被修改,但是指针指向的内容也就是*p可以被修改
int a = 10, b = 2;
int *const p = &a;
p = &b; //错误,因为p被const修饰不能被修改。
*p=20; //可以修改指针指向内容也就是*p
2.void
(1)不允许修饰普通变量: void a; //错误!!
(2)可以修饰指针: void *p; //此时p是一个任意类型的指针
使用场景:函数传参或函数返回值。例如malloc函数的返回值。
注意: 通过void型指针进行取内容时,需要对地址进行强转。
int a = 10;
void *p = &a; //p数据类型为void *
int *q = (int *)p; //将p转换成int *类型的指针然后赋值给q
printf("%d %d\n", *(int *)p, *q); //10 10
3. 大小端
在计算机进行超过1字节数据进行存储时,会出现存储数据顺序不同的情况即大小端存储
大端:数据的低位存储在高地址位,数据的高位存储在低地址位,大端字节序称为MSB
小端:据的低位存储在低地址位,数据的高位存储在高地址位,小端字节序称为LSB
举例: 存储数据0x12345678 起始地址0x4000
地址:0x4000 0x4001 0x4002 0x4003
小端:0x78 0x56 0x34 0x12
大端:0x12 0x34 0x56 0x78
注意:强制转换不会改变变量本身的数据类型,而是拿到转换后的结果做应用
二级指针
一级指针:存放普通变量的地址
二级指针:存放一级指针的地址
格式
存储类型 数据类型 **指针变量名;
int a=10;
int *p=&a;
int **q=&p;
p指向了a, q指向了p也就是等于p的地址。
访问a的值,a的地址:
a的值 a的地址 p的地址
a &a &p
*p p q
**q *q
指针和数组
1.两种访问方式
直接访问:按变量的地址存取变量的值 (通过数组名访问)
间接访问:通过存放变量地址的指针访问 (通过指针访问)
2. 指针和一维数组
(1)用法
int a[5] ={1,2,3,4,5}; //a数组的首地址
int *p=a;
通过数组名直接访问
元素:a[i] 和 *(a+i)
地址:&a[i] 和 a+i
通过指针间接访问
元素:p[i] 和 *(p+i)
地址:&p[i] 和 p+i
注意:a和p数值上一样,但是本质不同。
(1)a是地址常量,p是指针变量。
(2)a不能执行++操作,但是p可以。
(2)++和*的运算方法
(1)++和*是单目运算符
(2)单目运算符从右向左运算
(3)++在在前先++再取值,++在后先取值再加加。
(4)++结合内容则内容加加,++结合的是指针那么则指针加加
3.指针和二维数组
二维数组数组名表示
int a[2][3] = {1,2,3,4,5,6};
a是数组名,表示第一行的地址,a+1表示第二行的地址。
在行地址前面加*表示将行地址降级为列地址。
*a: 表示第一行第一列的地址
*a+1: 表示第一行第二列的地址
*(a+1): 表示第二行第一列的地址
*(a+1)+1: 表示第二行第二列的地址
元素:
a[i][j]
*(*(a+i)+j)
*(a[i]+j)
地址:
&a[i][j]
*(a+i)+j
a[i]+j
数组指针
1.定义
本质还是指针,指向的是数组。 (又称行指针)
2.格式
存储类型 数据类型 (* 指针变量名)[列数];
int a[2][3] = {1,2,3,4,5,6};
int (*p)[3] = a;
p的类型也是 int (*)[3], 运算要3个3个运算
p可以代替a进行元素访问,但是本质不同,p是指针变量,a是地址常量。
访问地址:
&p[i][j]
p[i]+j
*(p+i)+j
访问元素:
p[i][j]
*(p[i]+j)
*(*(p+i)+j)
3. 大小
sizeof(p) = 8
因为本质还是指针,所以大小都是8字节。如果32位系统是4字节
指针数组
1.定义
所谓指针数组是指由若干个具有相同存储类型和数据类型的指针变量构成的集合
其本质是数组,里面存放的是指针
2.定义格式
存储类型 数据类型 *数组名[元素个数]; int *a[2];
指针数组名还是表示该数组的首地址
3.应用
(1)用于存放普通变量的地址
int a=10,b=20,c=30;
int *p[3] = {&a,&b,&c};
访问元素:
*p[i]
**(p+i)访问地址:
p[i]
*(p+i)
(2)用于存放二维数组中每行第一列的地址 (列地址)
int a[2][3] ={1,2,3,4,5,6};
int *p[2] = {a[0], a[1]}; //或者*a, *(a+1)
访问地址:
&p[i][j]
p[i]+j
*(p+i)+j访问元素:
p[i][j]
*(p[i]+j)
*(*(p+i)+j)
(3)用于存放字符串
char *p[3] = {"hello", "world","666"};
打印字符还是这三个公式:*(p[i]+j) *(*(p+i)+j) p[i][j]
(4)命令行参数
int main(int argc, char const *argv[])
{
printf("%s\n",argv[0]);
}
argv:就是一个指针数组,里面存放的是命令行传递的字符串
argc:表示argv指针数组里面存储数据的个数,即命令行传递字符串的个数