C语言学习--指针和数组、const修饰指针
数组名:【数组名是地址常量】-- 不可以被修改
#include<stdio.h> int main (void) { int a[3] = {1,2,3};//a是数组名, 数组名是地址常量,不能被修改 int b[3] ; printf("the a is %x", a); b = a ;// 这样的code 是错误的, 因为b代表的含义是数组int b[]的地址, 但是数组名是常量, 是不能被修改的. }
指针是变量, 可以使用数组名给指针复制
#include<stdio.h> int main (void) { int a[3] = {1,2,3};//a是数组名, 数组名是地址常量,不能被修改 int b[3] ; int *p = b;//p是指针变量, b是地址常量, 可以把常量复制给变量 }
取数组元素
#include<stdio.h> int main (void) { int a[3] = {1,2,3};//a是数组名, 数组名是地址常量,不能被修改 for (int i=0 ; i < 3; i++) { printf("the i values is %d\n", a[i]); } }
#include<stdio.h> int main (void) { int a[3] = {1,2,3};//a是数组名, 数组名是地址常量,不能被修改 for (int i=0 ; i < 3; i++) { printf("the i values is %d\n", a[i]); // a[i] == *(a+i) } printf("-----------------------\n"); for (int i=0 ; i < 3; i++) { printf("the i values is %d\n", *(a+i));// a[i] == *(a+i) } printf("-----------------------\n"); int *p = a; // a是地址常量, 复制给p for (int i=0 ; i < 3; i++) { printf("the i values is %d\n", p[i]); // p就是a } printf("-----------------------\n"); //int *p = a; for (int i=0 ; i < 3; i++) { printf("the i values is %d\n", *(p+i)); } }
the i values is 1
the i values is 2
the i values is 3
-----------------------
the i values is 1
the i values is 2
the i values is 3
-----------------------
the i values is 1
the i values is 2
the i values is 3
-----------------------
the i values is 1
the i values is 2
the i values is 3
指针和数组的区别
指针是变量,数组是常量
sizeof(指针) ---> 4字节
sizeof(数组) --》 数组的实际字节数
指针++ 操作数组
#include<stdio.h> int main (void) { //使用指针++操作数组, p++ int arr[] = {0,1,2,3,4,5,6,7,8,9}; int* p = arr; //arr是元素的气势地址位 int n = sizeof(arr)/ sizeof(arr[0]); for (int i = 0; i < n; i++) { printf("%d\n", *p); //每次循环之后间接引用的地址位都是偏移到下个元素的开始位置 p++; //p++ 每次会对p增加四字节的地址位 } } 0 1 2 3 4 5 6 7 8 9
#include<stdio.h> int main (void) { //使用指针++操作数组, p++ int arr[] = {0,1,2,3,4,5,6,7,8,9}; int* p = arr; //arr是元素的气势地址位 int n = sizeof(arr)/ sizeof(arr[0]); for (int i = 0; i < n; i++) { printf("p is %p\n",p); printf("%d\n", *p); //每次循环之后间接引用的地址位都是偏移到下个元素的开始位置 p++; //p++ 每次会对p增加四字节的地址位 } } p is 000000000061FDE0 0 p is 000000000061FDE4 // 每次增加四字节 1 p is 000000000061FDE8 2 p is 000000000061FDEC 3 p is 000000000061FDF0 4 p is 000000000061FDF4 5 p is 000000000061FDF8 6 p is 000000000061FDFC 7 p is 000000000061FE00 8 p is 000000000061FE04 9
指针类型的作用
(1) 间接引用 : 决定从指针存储的地址开始, 向后读取的字节数 (与指针本身的存储空间无关)
(2)加减运算
#include<stdio.h> int main (void) { int a = 10; char b = 'a'; short c = 11; printf("sizeof int %d\n",sizeof(a)); printf("sizeof char %d\n",sizeof(b)); printf("sizeof short %d\n",sizeof(c)); printf("--------------------------------\n"); int d = 0x12345648; //d所占的空间是四字节 int* p1 = &d; char* p2 = &d; short* p3 = &d; printf("*p1 is %p\n", *p1);//只引用4字节, 只读d内空间的四个字节, 相当于全读 printf("*p2 is %p\n", *p2);//只引用1字节
printf("*p3 is %p\n", *p3); }//只引用2字节
sizeof int 4
sizeof char 1
sizeof short 2
--------------------------------
*p1 is 0000000012345648
*p2 is 0000000000000048
*p3 is 0000000000005648
数据类型在加减运算中的作用
#include<stdio.h> int main (void) { //不同的指针类型, 决定了指针进行+1 操作向后加过的字节数 printf("--------------------int int int int int------------------\n"); int a = 10; int* p = &a; //p变量里面的名字就是a的地址 printf("the p is %d\n", p); printf("the &a is %d\n", &a); printf("the p+1 is %d\n", p+1); printf("--------------------short short short----------------------\n"); short* p1 = &a; //p变量里面的名字就是a的地址 printf("the p1 is %d\n", p1); printf("the &a is %d\n", &a); printf("the p1+1 is %d\n", p1+1); printf("--------------------char char char-------------------------\n"); char* p2 = &a; //p变量里面的名字就是a的地址 printf("the p2 is %d\n", p2); printf("the &a is %d\n", &a); printf("the p2+1 is %d\n", p2+1); } --------------------int int int int int------------------ the p is 6422020 the &a is 6422020 the p+1 is 6422024 --------------------short short short---------------------- the p1 is 6422020 the &a is 6422020 the p1+1 is 6422022 --------------------char char char------------------------- the p2 is 6422020 the &a is 6422020 the p2+1 is 6422021