指针就是数据所在的内存地址,通过指针变量可以是操作这块内存地址。
- 指针声明:type * p;
- 取地址:&x
- 取值:*p
- 修改与访问:*p = 101;
#includeint main() { int a = 10; // 1.声明指针变量: type * pointerName; int * p; // 取地址符号& p = &a; printf("%dn",a); // 10 // 指针的值即内存地址,一般用十六进制表示 printf("%xn",&a); // abfffd94 printf("%xn",p); // abfffd94 // 2.访问与修改 // 取值符号* *p = 101; printf("%dn",a); // 101 return 0; }
指针大小
- 64位-8字节,32位-4字节
// 3.指针占内存大小
printf("size:%dn",sizeof(p)); // 8
printf("size:%dn",sizeof(int *)); // 8
空指针-未指向的指针
int * p = NULL;
野指针-非法访问的内存空间
int * p = (int *)0x1100;
const修饰指针
常量指针-指针的指向不可以改,指针的值可以改
int * a = 10; const int * p = &a; // 常量指针 *p = 101; // 可以改 int b = 20; p = &b; // 不可以改
指针常量-指针的指向、指针的值都不可以改
int a = 10; const int * const p = &a;数组与指针联用
数组是连续存储结构,所以指向数组指针可以++
#include函数与指针传递int main() { int a[10]; for (int i = 0; i < 10; i++) a[i] = i; // 用指针访问数组 int * p = a; // 以下代码等价 //int * p = &a[0]; for (int i = 0; i < 10; i++) { printf("a[%d] = %dt",i,*p);p++; } return 0; }
指针传递可以修改参数变量的内容
#include函数、数组与指针联用void swap(int* a,int* b) { int tmp = *a; *a = *b; *b = tmp; } int main() { int a,b; a = 10; b = 20; printf("%d,%dn",a,b); // 10,20 swap(&a,&b); printf("%d,%dn",a,b); // 20,10 return 0; }
数组可以看成是首地址,即数组第一个元素的指针。
int* gen(int n) {
static int arr[100];
for (int i = 0; i < n; i++) {
arr[i] = i;
}
return arr;
}



