1 使用格式控制符 %p 来输出,打印指针
2 int a = 0x12345678;
3
4 printf("a的地址为:%p\n" , &a ); // 0x7ffedda99114
5 printf("a的地址为:%ld\n" , &a ); // 140732617298196
#include
int main()
{
int a1[5][5];
int b1[5];
int a=0x12345678;
char b;
long c;
short d;
long long e;
printf("the address of a is:%p\n",&a);
printf("the address of b is:%p\n",&b);
printf("the address of c is:%p\n",&c);
printf("the address of d is:%p\n",&d);
printf("the address of e is:%p\n",&e);
printf("a1[0] =0x%p\n",&a1[0]);
printf("a1[0][0]=0x%p\n",&a1[0][0]);
printf("a1 =0x%p\n",&a1);
printf("a1[0][0]=0x%p\n",&a1[0][1]);
printf("a1[0][0]=0x%p\n",&a1[1][0]);
return 0;
}
在程序中,一般是通过变量名来对内存单元进行存取操作的。其实程序经过编译后已经将变量名转变为变量的地址。对变量值的存取都是通过地址进行的。这种按照变量地址存取变量值的方式称为:直接存取方式,或直接访问。
2、定义指针变量(指针变量只能用来存储地址,不能存放其他变量)
定义指针的一般形式:基类型 *指针变量名
如: int i,j;
int *pointer_1, *pointer_2; //定义指针变量pointer_1,pointer_2
注意:指针变量名是pointer_1,pointer-2,而不是*pointer_1,*pointer_2,既“*”不是指针变量名的一部分。在变量名前加一个“*”表示该变量是指针变量。既定义为 int * .
指向数据的类型 * 指针的名称 ;
int * ptr1 ;
char * ptr2 ;
如何初始化化:
int a = 250 ;
int * ptr = &a ;
// 1 向系统申请一个内存 名字设置为 ptr
// 2 * 该内存用来存放一个数据的内存地址
// 3 int 该内存地址中应该用来存放一个整型数据
// 该指针用来指向的数据应该是一个整型的数据
// 4 把变量a的内存地址取出来并存入到 该内存中
/*
* @Author: error: git config user.name && git config user.email & please set dead value or install git
* @Date: 2022-07-21 14:12:46
* @LastEditors: error: git config user.name && git config user.email & please set dead value or install git
* @LastEditTime: 2022-07-21 19:35:38
* @FilePath: \share code\day08\ex01.c
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
// #if 0
// #include
// int main()
// {
// int a1[5][5];
// int b1[5];
// int a=0x12345678;
// char b;
// long c;
// short d;
// long long e;
// printf("the address of a is:%p\n",&a);
// printf("the address of b is:%p\n",&b);
// printf("the address of c is:%p\n",&c);
// printf("the address of d is:%p\n",&d);
// printf("the address of e is:%p\n",&e);
// printf("a1[0] =0x%p\n",&a1[0]);
// printf("a1[0][0]=0x%p\n",&a1[0][0]);
// printf("a1 =0x%p\n",&a1);
// printf("a1[0][0]=0x%p\n",&a1[0][1]);
// printf("a1[0][0]=0x%p\n",&a1[1][0]);
// return 0;
// }
// #endif
#include
int main()
{
int a=250;
int *ptr=&a;
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int *p=arr;
int *p1=arr;
printf("p1= %p\n",p1);
p1=arr+1; //p1指向arr数组的基地址+1(+1简单地址+1)
printf("p1=arr+1= %p1\n",p1);
p1= &arr+1; //p1指向arr数组的基地址+sizeof(arr)*1的位置处
printf("p1=&arr+1=%p1\n",p1);
printf("a:addres=%p\n",&a);
printf("ptr=%p\n",ptr);
printf("&ptr=%p\n",&ptr);
printf("*ptr=%d\n",*ptr);
printf("*p=%d\n",*p);
printf("p[1]=%d\n",p[1]);//1、等价于 p[1]=*(p+1),内部规定解引用
//2、记住 *(p+i) == p[i]
//3、或可以理解你把一维数组的首元素地址a(就是&a[0] = a,
//数组名a就是数组的首元素地址)给了p,p其实就等价于a,那p[2]==a[2]了
printf("*(p+2)=%d\n",*(p+2));//(指针变量偏移两个int类型)在指向存储内容
}
int a = 250 ;
int * ptr = &a ;
printf("*ptr:%d\n" , *ptr );
*ptr = 550 ;
#include
int main()
{
int *p1;
char *p2;
long long *p3;
printf("sizeof(p1)=%ld\n",sizeof(p1));
printf("sizeof(p2)=%ld\n",sizeof(p2));
printf("sizeof(p3)=%ld\n",sizeof(p3));
}
#include
int main(int argc, char **argv)
{
char a[10]={1,2,3,4,5,6,7,8,9,10};
int *pi=a;
char *pc=a;
printf("pi=%#p\n",pi);
printf("pc=%#p\n",pc);
pi++;
pc++;
printf("pi=%#p\n",pi);
printf("pc=%#p\n",pc);
printf("*pi=0x%08X\n",*pi);//int类型,解引用后出现四个字节,占据数组四个位,输出四个值
printf("*pi=0x%02X\n",*(char *)pi);//强制类型转换,输出一个数
printf("*pi=0x%X\n",*(short *)pi);
printf("*pc=%d\n",*pc);
return 0;
}
#include
int main()
{
int arr[10] = {1,250,3,4,5,6,7,8,9,0};
int * p = arr ; // 定义一个指针p 并让他执行了数组arr的首元素的首地址
printf("*p:%d\n" , *p );
printf("*(p+1):%d\n" , *(p+1) );
printf("*(p+5):%d\n" , *(p+5) );
}
int arr[5] = {1,2,3,4,5};
int *p = arr;
int *p1 = &arr+1;
printf("%d , %d , %d \n" , *p , *(p1-1) , *(p+1));
int a ; // 定义变量a但是没有赋值因此它的值是随机值
int * p ; // 定义变量p但是没有赋值因此它的值是随机值 他就是一个野指针
int * p1 = malloc(1024); // 定义变量p1 并使用mallo 分配了1024字节的内存给他
free(p1) ; // 通过free函数来释放p1所指向的内存
// 当前p1依旧指向刚才申请后并释放了的内存
// 换而言之 p1指向了一个已经被系统回收的内存属于非法内存
int *p=NULL;//定义指针变量,暂时不使用,可以给它NULL;(就是一个空指针,它指向0地址)
#include
int main(int argc, char const *argv[])
{
int arr[10] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 0};
int *p1 = arr; // 定义一个整型指针,该指针指向数组arr的首元素的首地址 1的地址
// 一下三个语句的输出一致
printf("arr:%p\n", arr);
printf("&arr:%p\n", &arr);
printf("p1:%p\n", p1);
// 如何通过指针 p1 来访问整个数组
for (int i = 0; i < 10; i++)
{
printf("%p:%d\n", (p1 + i), *(p1 + i)); // (p1+i) 是对指针p1的运算,由于p1 是整形的指
// (p1+i) 运算后依旧是一个地址值, 因此 * 则用来访问该地址中的数据
}
//如何定义一个用来指向数组的指针 --> 数组 指针
// int * p ;
// int [10]
int(*p2)[10] = &arr; // 定义一个数组指针 p2 , &arr 表示整个数组的地址,数组指针规定写法int (*p2)[]
printf("p2+1:%p\n", p2 + 1); // p2 是一个数组类型的指针,因此+1 则加一个数组的大小
// 如何通过 p2来访问数组arr的内容
for (int i = 0; i < 10; i++)
{
// *p2 对指针p2进行一次解引用 得到的是数组中的第一个元素的地址
// ** p2 对指针p2进行两次解引用。 得到的是数组中第一个元素的地址中的值
printf("%p:%d\n", *p2 + i, *(*p2 + i));
}
return 0;
}
int *p;
p+=1;//加一个int类型(4个字节)
int a[5]={1,2,3,4,5};
int *p=&a+1;//指向数组的基地址+sizeof(a)*1的位置