c/c++指针入门学习
指针的的使用
指针就是数据所在的内存地址,通过指针变量可以是操作这块内存地址。
- 指针声明:
type * p;
- 取地址:
&x
- 取值:
*p
- 修改与访问:
*p = 101;
#include <stdio.h>
int main() {
int a = 10;
// 1.声明指针变量: type * pointerName;
int * p;
// 取地址符号&
p = &a;
printf("%d\n",a); // 10
// 指针的值即内存地址,一般用十六进制表示
printf("%x\n",&a); // abfffd94
printf("%x\n",p); // abfffd94
// 2.访问与修改
// 取值符号*
*p = 101;
printf("%d\n",a); // 101
return 0;
}
指针大小
- 64位-8字节,32位-4字节
// 3.指针占内存大小
printf("size:%d\n",sizeof(p)); // 8
printf("size:%d\n",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 <stdio.h>
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] = %d\t",i,*p);p++;
}
return 0;
}
函数与指针传递
指针传递可以修改参数变量的内容
#include <stdio.h>
void swap(int* a,int* b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
int main() {
int a,b;
a = 10;
b = 20;
printf("%d,%d\n",a,b); // 10,20
swap(&a,&b);
printf("%d,%d\n",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;
}