指针是什么 计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int占用4个字节,char占 用 1 个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号一样,每个字节的编号是唯一的,根据编号找到某个字节。我们将内存中字节的编号称为地址(Address)或指针(Pointer)。地址从0开始依次增加,对于32位环境,程序能够使用的内存为4GB。 最小的地址为 0x0000 0000,最大的地址为 0XFFFF FFFF(16进制)。
int main(){
int a=1,b=2;
int z=a*b; **
int *p=&a; **
*p=10; **
}
一、指针的定义
指针的定义与普通变量的定义很类似,不过要在变量名前加上 * ,便于区分,格式为 datatype *name 或者 datatype *name,*表示这是个指针变量,datatype是指针所指向数据的类型
int main{
int a=1,b=2;
int *s=&a;
int *p=NULL; p=&b;
}
指针的大小:只跟平台有关,和定义指针的类型无关,在32位平台是四个字节,在64位平台是八个字节
空指针和野指针
int *p;
int *q=NULL
空指针和野指针都可能会导致程序崩溃
利用 typedef 定义指针
typedef int* Point_32;
typedef long long * Point_64;
int main() {
int a,*b;
Point_32 c, d;
}
二、指针的应用
void DataExchange(int a, int b) {
int t = a;
a = b;
b = t;
}
int main() {
int a = 10, b = 20;
DataExchange(a, b);
printf("a:%d b:%d", a, b);
}
我们希望a,b进行交换,但此时通过上面函数调用a,b值并未发生变化 形参变换,而实参并未发生改变
void DataExchange(int *p, int *q) {
int t = *p;
*p = *q;
*q = t;
}
int main() {
int a = 10, b = 20;
DataExchange(&a, &b);
printf("a:%d b:%d", a, b);
}
通过指针交换,a,b的值发生交换
三、指针的运算
1、指针 ± 整形 2、指针 + 指针(不可以) 3、指针 - 指针 (结果为整形) 指针的类型不同,加1的作用也不同 typename *p; p=p+1;被编译器解释为:p=p+sizeof(typename)*1; 指针和整形加减后的结果仍然是指针类型 指针的强制转换
int main() {
int num = 0x12345678;
int *p = #
char* q = (char*)p;
printf("%x", *q);
}
\\运行结果为 78
四、指针与数组的关系 函数指针
数组指针
一个指向数组的指针
typedef int (*Arr_Point)[4];
int main() {
int brr[3][4];
int(*p)[4] = brr;
int(*p)[4] =&brr[0];
Arr_point p=arr;
p++;
int* q = &brr[0][0];
q++;
int(*w)[3][4] = &brr;
w++;
}
指针数组
一个保存指针类型数据的数组
const char *arr[5]={"hello","world"};
arr[0]="hi";
const char *p=arr[0];
函数指针
int add(int a, int b) {
return a + b;
}
int mul(int a, int b) {
return a * b;
}
int main() {
int a, b;
char op;
scanf("%d%d", &a, &b);
scanf("%s", &op);
int (*pfun)(int, int);
if (op == '+') {
pfun = add;
}
else {
pfun = mul;
}
int result = pfun(a, b);
printf("%d", result);
}
五、二级指针
六、const 和 指针 的结合
const 与 一级指针
int a=1;
int const *p=&a;
*p=2;
const修饰指针变量,即 p的值不能发生改变, 但是可以通过解引用修改a的值
int a=1,b=2;
int const *p=&a;
p=&b;
const修饰p所指向的值,这个值不能发生改变,但是可通过对p值得修改,从而p的指向
int a=1;
int const * const p =&a;
p的值和p所指向的值都不能发生改变
一级指针的正确定义
const 与 二级指针
二级指针的使用
int a=0,b=0;
int *p=&a;
int ** q=&p;
*p=1;
**q=2;
*q=&b;
**q=3;
p=&a;
**q=1;
二级指针的正确定义
七、判断大小端
int main() {
int num = 0x12345678;
int *p = #
char* q = (char*)p;
printf("%x", *q);
}
\\运行结果为 78
通过对指针的强转,可知windows为小端存储 小端存储:低位存储低位数据,高位存储高位数据,大端存储反之
|