一级指针:指向变量的地址
指针存放的是变量在内存中的地址编码;
指针的大小在32位情况下大小都是4字节;
野指针:指针变量指向了一个未知的空间,如果操作该空间可能会报错
0-255都是被操作系统占用的只读内存空间;
通过操作野指针改变内容可能会导致程序异常: (
int* p = 10野指针; *p = 10操作地址对应的内容;)
void*:万能指针可以指向任意类型变量的地址
void* 指针名 = & 常量;
void* 类型变量在通过地址操作变量的值,需要强制转换为相同类型的指针
const:定义常量
const定义的变量可通过指针修改其值,所以不安全
const int a = 10;
int* pa = &a;
*pa = 100;
const修饰靠最近的
int a = 10;
int b = 20;
int c = 30;
const int* pa = &a; //修饰int* 不能改变指针指向的地址的值
//*pa = 100; 不能被修改
int* const pb = &b; //修饰pb,不能修改指针的值
//pb = &c;不能被修改
const int* const pc = &c;//都不能修改但可以通过二级指针进行修改
数组与指针
数组的下标具有降级的功能,相当于解引用;
数组名就是数组的首地址
是一个常量,可以参与运算但不能被赋值
;
数据类型* 指针名 = 数组名 可以通过指针来操作数组;
注意指针数据类型必须与数组数据类型相同
int arr[]={1,2,3,4,5,6,7};
int* p = arr; | int* p = &arr;(二级指针)
*(p++) = arr[1]; |p++->跨过整个数组空间
指针数组 int* p[3] 数组里面的每一个元素都是一个指针
数组指针 int (*P)[3] 一个指向数组地址的指针
#include <stdio.h>
#include <string.h>
int main()
{
int arr1[] = {60,60,60};
int arr2[] = {70,70,70};
int arr3[] = {80,80,80};
int* parr[] = {arr1,arr2,arr3};
int sum = 0;
for(int i = 0; i < 3;i++)
{
for(int j = 0; j < 3; j++)
sum += *(*(parr + i) + j);//方法1
//sum += *(parr[i] + j);//方法2
//sum += parr[i][j];//方法3
}
printf("%d ",sum);
system("pause");
return 0;
}
/
char ch1[] = "hello";//字符串以'\0'结束
char* p = &ch1+1;
printf("%c\n",*(p - 2));
输出‘o’;
char ch1[] = "habchello";//字符串以'\0'结束
int* p = &ch1+1;
printf("%c\n",*(p - 2));
输出‘b’