C语言基础知识(四)

来源:互联网 发布:csgo awp 数据 编辑:程序博客网 时间:2024/06/06 04:58

gcc/gdb
指针基础
内存编号=>地址
变量的地址 &a
地址变量 int *p;
定义
赋值
* &
引用
零指针,空类型指针,野指针
const 与指针
指针运算
算术运算
关系运算
赋值运算
指针与一维数组
一维数组名含义
sizeof()
+1含义
int *p = &a[0];//int *p = a;
gcc
预处理-> 编译-> 汇编->链接
gdb
gcc -g test.c -o test
gdb test
指针:
含义:内存编号,地址,指针.
符号:
& 取址符,取变量在内存中的编号(地址).->取到的是32位的地址.
* 取值符,取对应地址的内存中的数据. ->取到的是内存中的数据.
定义:
int a;
int *p = &a;// 定义一个指针变量,同时将p指向a。(初始化)
*p = 100; //通过指针改变a的值为100,相当于 a = 100
int b;
int *q; //定义一个指针变量,用来存放int型变量的地址
q = &b; //将指针指向b,即p中存放的是b的地址编号.
*q = 99; //通过*q将b的值变为99,相当于 b = 99

赋值:
p = &a;
p = &b;
*
乘法 a*b, 取值 b = *p, 定义指针int * p;
& 位与 取址
引用:
b = *p;
*p = 998;
printf("%d\n", *p);
scanf("%d", &a)==scanf("%d", p);
野指针
没有初始化的指针变量
空类型指针:
int a = 998;
int *pi = &a;
void *pv=NULL;
其他类型指针可以直接赋值给空类型指针。
pv = pi;
void *赋值给其他类型指针要强转。
pi=(int *)pv
指针的强制转换
(int)p //将指针强制转换为整数
(int *)p //将指针强制转换成int *指针
const 使常量化
int a = 99;
int const a = 99;
const int a = 99;
const 使a常量化。
int a = 99;
int b = 999;
int *p = &a;
*p=*p+1; //通过p修改a的值
p = &b; //p指向其他变量
int *const pp = &a; //pp是常量
//pp = &b; //pp是常量不可以改变p的值,即不可以改变p的指向。
*pp = *pp+1; //不可改变指向,但可以改变指向的值.
int const *qq = &a; //(*qq)是常量
const int *qq = &a; //同上,两种效果相同。
//*qq=*qq+1; //*qq是常量,不可以通过*qq去改变a的值。
qq=&b; //qq可以指向其他的变量。
a=a+1;//*qq常量化,表示不能通过*qq去改变a的值,但a可以改变。
int const * const ppp = &a; //ppp和*ppp都被常量化。
const int *const ppp = &a;
指针的运算:
算术元素
int a = 998, *p = &a;
p+1==>
sizeof(p)==>
char c = 98, *q = &c;
q+1==>
sizeof(q)==>
p++ ==> p+=1,指向下一个元素
*p++, ==>*(p++) 先取*p的值,p再指向下一个元素
*++p ==> *(++p) p先指向下一个元素,再取元素的值
(*p)++ 先取元素的值,元素再++
++(*p) 元素的值先++,再取值.
关系运算
赋值运算
指针与一维数组
一维数组的数组名代表一维数组的指针(起始地址).
[ ] 又叫做变址运算符
a[i] <=> *(a+i) 在计算机内部实现的时候,数组下标都会转化为地址。
若地址变量px的地址值等于数组指针x(指针变量px指向数组的首地址),则:
x[i]、*(px+i)、 *(x+i) 和px[i]具有相同功能的功能:访问数组第i+1个数组元素。
eg:
int a[4];
int *p = a;
a[i] = p[i] = *(a+i) = *(p+i);




0 0