C语言学习随笔-15 指针_02 指针的定义和使用
- 指针也是一种数据类型,指针变量也是一种变量
- 指针变量指向谁,就把谁的地址赋值给指针变量
- "*" 操作符操作的是指针变量指向的内存空间
1、定义指针变量存储变量地址
int a = 10;
2、使用%p获取变量在内存中的地址
int main() { int a = 0xaabbccdd; //a = 100; //获取a的内存地址 printf("%p\n",&a); getchar(); return 0; }
3、指针类型定义语法:指针类型 -> 数据类型*
注:定义指针类型一定要和变量的类型一致
int* p;//定义了一个int类型的指针P p = &a;//把a的地址赋值给指针P
4、通过指针修改变量的值
*p = 100; printf("%p\n",&a);//%p 是以十六进制输出指针 printf("%p\n",p); printf("%d\n",a);//这里使用%d是输出a的十进制 printf("%d\n",*p);
//int*代表是一种数据类型。int*指针类型,p才是变量名 //定义了一个指针类型的变量,可以指向一个int类型变量的地址 int* p; p = &a;//将a的地址赋值给变量p,p也是一个变量,值是一个内存地址编号。 printf("%d\n",*p);//p指向了a的地址,*p就是a的值 char* p1 = &b; printf("%d\n",*p1);//p1指向了b的地址,*p1就是b的值
4、指针大小
◆ 使用sizeof()测量指针的大小,得到的总是:4或8。
◆ sizeof()测的是指针变量指向存储地址的大小。
◆ 在32位操作系统下,所有指针(地址)都是32位(4个字节)。
◆ 在64位操作系统下,所有指针(地址)都是64位(8个字节)。
int main(void) { char ch = 'a'; char* p = &ch; //在win32位操作系统下指针类型是4个字节大小,在win64位操作系统下指针类型是8个字节大小 printf("%d\n",sizeof(char*)); printf("%d\n", sizeof(int*)); printf("%d\n", sizeof(short*)); printf("%d\n", sizeof(long*)); printf("%d\n", sizeof(long long*)); printf("%d\n", sizeof(float*)); printf("%d\n", sizeof(double*));
return 0; }
5、野指针
- 指针变量也是变量,是变量就可以任意赋值,不要越界即可(32位为4字节,64位为8字节)。
- 但是任意数值赋值给指针变量没有意义,因为这样就成了野指针,此指针指向的区域是未知的(操作系统不允许操作此指针指向的内存区域)。
- 所以,野指针不会直接引发错误,操作野指针指向的内存区域才会出现问题。
int main0201(void) { /* 不建议将一个变量的值直接赋值给指针 野指针:指针变量指向一个未知空间 */ int a= 100; int* p; p = a;//把a的值赋值给指针变量p,p为野指针,不会有问题,但没有意义 p = 0x12345678;//给指针变量p赋值,p为野指针,不会有问题,但没有意义 //*p = 1000;//操作野指针执行未知内存,内存出问题,报错 //操作系统将0-255作为系统占用不允许访问操作 //操作野指针对应的内存空间可能会报错 printf("%d\n",p);//程序报错 return 0; }
6、空指针
野指针和有效指针变量保存的都是数值,为了标志此指针变量没有指向任何变量,C语言中,可以把NULL值赋值给次指针,这样就标志此指针为空指针,没有任何指针。
int *p = NULL;
int main() { //空指针是指内存地址编号为0的空间 int* p = NULL; //操作空指针对应的空间一定报错 //*p = 100; printf("%d\n", *p);//报错 //空指针可以用在条件判断 if (p == NULL) { } return 0; }
7、万能指针
void * 指针可以指向任意变量的内存空间
int main() { int a = 10; //int* p = &a; //万能指针可以接受任意类型变量的内存地址 void* p = &a; //在通过万能指针修改变量的值时,需要找到变量对应的指针类型 *(int*)p = 100; printf("%d\n",a); printf("%d\n",*(int*)p); //printf("%p\n",p); return 0; }
8、const修饰指针
- const修饰指针类型:可以修改指针变量的值,不可以修改指针指向内存空间的值
int mainvoid) { int a = 10; int b = 20; const int* p = &a; p = &b;//ok //*p = 100;err printf("%d\n",*p); return 0; }
- const修饰指针变量:可以修改指针指向内存空间的值,不可以修改指针变量的值
int main(void) { int a = 10; int b = 20; int* const p = &a; //p = &b;err *p = 200;//ok printf("%d\n",a); return 0; }
- const既修饰指针类型又修饰指针变量:只读指针
int main(void) { int a = 10; int b = 20; //const修饰指针类型 const修饰指针变量 只读指针 const int* const p = &a; printf("%d\n",*p);//10 //**pp是一级指针变量的值 可以修改 int** pp = &p; //*pp是一级指针的值 *pp = &b;//通过二级指针可以修改一级指针的值 **pp = 100;//通过二级指针可以修改一级指针指向的内存空间的值 printf("%d\n",*p);//20 //p = &a;err //*p = 100;err return 0; }

浙公网安备 33010602011771号