一、指针简介(任何指针变量在内存中占八个字节的存储空间)
1.定义指针变量(格式):变量类型 *变量名;--定义一个指向整形变量的指针 int *p;
2.作用:指针变量就是用来存储其他变量的地址;--int a=10;
//指针将变量a的地址赋给指针变量p
p = &a;//&是取地址符号,数组有两种方法获得内存中的地址--例:
方法1:数组的变量名就是数组内存中的地址
//定义一个int类型的数组
int ages[2] = {10, 20 };//将数组的地址赋给指针变量p
p = ages; 或者 p = &ages;
方法2:数组中的第一个的地址就是该数组的地址--定义变量之后,在内存中开辟存储空间是从大到下寻地址,存放变量时,是在开辟的空间中,从小到大分配地址
p = ages[0];
图解:只是为了讲解,内存地址有地方不对
3.访问:
指针变量中存入了某个变量的地址后,,可以通过地址来访问或者改变地址中的变量,方式:
*p = 11;
二、指针注意点:
1.任何指针变量都占用8个字节的存储空间
2.指针类型只能指向对应类型的变量,比如int *p只能指向int类型的数据,不然会出错
3.指针是用来存储地址的,不要随便赋值一个变量。例如:
float *p1 ; p1 = 100 ;--这是错误写法
4.float f =1.5f ;
float *p = &f ;//这一句代码其实做了2件事--1)定义了指针变量p;2)让指针变量p指向了f
*p = 5.6f ;
三、指针和数组
利用指针遍历数组元素,方法一:这种遍历方式,指针的值从未变过
1 void test3() 2 { 3 int ages[4] = {10, 11, 56, 47}; 4 6 int *p = ages; 7 8 //p + 1; // &ages[1] 9 //p + 2; // &ages[2] 10 //p + 3; // &ages[3] 11 //p + i; // &ages[i] 12 13 for (int i = 0; i<4; i++) 14 { 15 int num = *(p + i); 16 printf("ages[%d]=%d ", i, num); 17 } 18 19 // 这种遍历方式,指针的值从未变过 20 printf("%d ", *p); 21 22 }
利用指针遍历数组元素,方法二:这种遍历方式,指针的值一直在改变
1 void test5() 2 { 3 int ages[4] = {10, 11, 56, 47}; 4 5 int *p = ages; 6 7 for (int i = 0; i<4; i++) 8 { 9 printf("ages[%d]=%d ", i, *p); 10 p++; 11 // p = p + 1; 12 } 13 14 // 这种遍历方式,指针的值一直在改变 15 }
四、详解指针的p+1
1.指针变量的+1并不是基本数据类型中简单的+1;
2.p+1究竟是增加了多少,取决于指针的类型;
指针的p+1跟指针所指向的数据类型有关,如下:
char * 1
int * 4
double * 8
long * 8
五、指针与字符串:重点--char *name = "hello" ;-->不可改变(可以理解为字符串常量) char name[] = "hello" ;-->可以改变(可以理解为字符串变量)
1.利用数组存储的字符串是可变的
1 void test1() 2 { 3 int a; 4 5 // 利用数组存储的字符串是可变的 6 char names[] = "itcast"; 7 8 //char names[] = {'i', 't', 'c', 'a', 's','t', ' '}; 9 10 char *p = names; 11 12 *(p + 3) = 'A'; 13 14 //printf("%s ", p + 2); 15 16 printf("%s ", names); 17 }
2.直接利用 指针变量指向的字符串,是不可变的
1 void test2() 2 { 3 // names这个指针变量指向了字符串的首字符'i' 4 // 直接利用指针变量指向的字符串,是不可变 5 char *names = "itcast"; 6 char *names2 = "itcast"; 7 8 // names和names2指向的是同一个字符 9 printf("names=%p ", names); 10 printf("names2=%p ", names2); 11 }
3.学习指针之前的字符串存储
char name[] = "hello" ;
char names[2][10] = { "hello" , "world" };
4.学习指针之后的字符串存储:
char *name = "hello" ;
//指针数组:数组里面装的元素是指针
//整形数组:数组里面装的元素是整型数据
char *names[2] = { "hello" , "world" } ;