指针(上)
指针的定义和使用:
int a=10;
int* p=&a;
指针是一种数据类型 p是指的指针类型变量 用来指向一个变量地址
指针类型在内存中的大小:在32位操作系统中所有指针类型的大小都是4字节大小
在地址的前面加上*可以取值 (内存地址) 可以找到对应的内存地址的值
例如:
int a=10;
int* p=&a;
*p=20;//此时a的值为20
无论什么类型的指针,存的都是地址
内存地址都是无符号整型的,所以都是4字节大小(这是在32位操作系统下,在64位系统中为8字节大小)
int a=10;
int* p=&a;
指针是一种数据类型 p是指的指针类型变量 用来指向一个变量地址
指针类型在内存中的大小:在32位操作系统中所有指针类型的大小都是4字节大小
在地址的前面加上*可以取值 (内存地址) 可以找到对应的内存地址的值
例如:
int a=10;
int* p=&a;
*p=20;//此时a的值为20
无论什么类型的指针,存的都是地址
内存地址都是无符号整型的,所以都是4字节大小(这是在32位操作系统下,在64位系统中为8字节大小)
万能指针
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
int a = 10;
//int* p = &a;
void * p = &a;
*(int*)p = 100;//把void*p类型强制转化为int*p类型
printf("%d\n", a);
printf("%d\n", *(int*)p);
system("pause");
return EXIT_SUCCESS;
}
return EXIT_SUCCESS;
}
int main()
{
int arr[10];
void * p = arr;
*(int*)p = 100;//arr[0]=100
*((int*)p + 1) = 200;//p转化为整数类型之后加1就能到达arr[1],并给arr[1]赋值
for (int i = 0; i < 10; i++)
{
printf("%d\n", arr[i]);
}
return 0;
}
{
int arr[10];
void * p = arr;
*(int*)p = 100;//arr[0]=100
*((int*)p + 1) = 200;//p转化为整数类型之后加1就能到达arr[1],并给arr[1]赋值
for (int i = 0; i < 10; i++)
{
printf("%d\n", arr[i]);
}
return 0;
}
const修饰指针
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{ //这种方式不安全 可以通过指针修改
//1.通过指针修改const修饰的常量
const int a = 10;
int * p = &a;
*p = 100;
printf("%d\n", a);
printf("%d\n", *p);
system("pause");
return EXIT_SUCCESS;
}
return EXIT_SUCCESS;
}
int main()
{
int a = 10;
//如果const修饰int*不能改变指针变量的内存地址的值 但是可以改变指针指向的地址
const int * p;
p = &a;
*p = 100;
printf("%d\n", *p);
return 0;
}
{
int a = 10;
//如果const修饰int*不能改变指针变量的内存地址的值 但是可以改变指针指向的地址
const int * p;
p = &a;
*p = 100;
printf("%d\n", *p);
return 0;
}
3.const修饰指针变量 能改变指针变量地址的值 但不能改变指针指定的地址
4.const修饰指针类型,也修饰指针变量,那麽不能修改指针指向的地址 也不能修改指针指向的值
const修饰内容 结果
1.const int a=10; 可以通过1级指针修改一个常量的值
int * p=&a;
*p=100;
1.const int a=10; 可以通过1级指针修改一个常量的值
int * p=&a;
*p=100;
2.const int * p=&a; const修饰指针类型,可以改变指针指向的地址
p=&b;
3.int * const p=&a const修饰变量,可以修改指针指向的地址上的值
*p=100;
*p=100;
4.const int* const p=&a const修饰指针的类型,const修饰指针的变量,都不能修改
指针和数组:
数组名是数组的首地址,这是一个常量,无法修改
int* p=arr //p=arr [数据类型*]变量名
指向数组的指针 当操作指针时 间接操作了数组
arr[2]指的是第二个元素的值
p++ *p=2 是p先加一,再赋值给p,此时p指的是第二个元素 ,再给第二个元素赋值为2
数组名和指针的区别:数组名通过sizeof可以求出数组的大小 指针只包含数组首地址的信息
数组名是数组的首地址,这是一个常量,无法修改
int* p=arr //p=arr [数据类型*]变量名
指向数组的指针 当操作指针时 间接操作了数组
arr[2]指的是第二个元素的值
p++ *p=2 是p先加一,再赋值给p,此时p指的是第二个元素 ,再给第二个元素赋值为2
数组名和指针的区别:数组名通过sizeof可以求出数组的大小 指针只包含数组首地址的信息