指针
1.sizeof运算符
#include <stdio.h> int main() { int a = 10; char b = 'a'; //sizeof运算符计算数据类型在内存中占的字节大小,返回值类型为unsigned int ->size_t //格式 : sizeof(数据类型) sizeof(变量名) int len = sizeof(a); int lens = sizeof(b); printf("整型变量在内存中占的字节大小:%d\n",len); printf("字符型变量在内存中占的字节大小:%d\n",lens); /* char ->1 short ->2 int ->4 long ->4 float ->4 double ->8 */ return 0; }
2.变量内存地址的打印
#include <stdio.h> int main(void) { int a =10; int b =20; //占位符 %p 打印数据的内存地址 unsigned int 十六进制表示 printf("变量a的内存地址:%p\n",&a); printf("变量b的内存地址:%p\n",&b); return 0; }
3.指针地址
#include <stdio.h> int main() { int a = 10; //获取变量a的内存地址 //指针类型定义 //int* p =&a; //指针变量 int* p; //指针变量p和变量a建立关系 p = &a; //打印内存地址 printf("%p\n",&a); printf("%p\n",p); //打印变量的值 printf("%d\n",a); //*p 对指针变量p进行取值操作 //& 升维度 *降维度 printf("%d\n",*p); return 0; }
4.通过指针改变数据值
#include <stdio.h> int main() { int a = 10; //int* 是一种数据类型 int* p = &a; //* 运算符 *p = 100; printf("%d\n",a); return 0; }
#include <stdio.h> int main() { //指针在内存中占的字节大小 int a = 10; int* p = &a; int len = sizeof(p); //所有指针类型在32位操作系统下是4字节,在64位操作系统中占8字节 printf("整型指针在内存中占的字节:%d\n",len); printf("字符型指针在内存中占的字节:%d\n",sizeof(char*)); printf("短整型指针在内存中占的字节:%d\n",sizeof(short*)); printf("长整型指针在内存中占的字节:%d\n",sizeof(long*)); printf("单精度型指针在内存中占的字节:%d\n",sizeof(float*)); printf("双精度型指针在内存中占的字节:%d\n",sizeof(double*)); return 0; }
5.指针作为函数参数
#include <stdio.h> void swap(int* a,int* b) { int temp = *a; *a = *b; *b = temp; } int main() { int a = 10; int b = 20; //值传递 形参不能改变实参的值 //地址传递,形参可以改变实参的值 swap(&a,&b); printf("%d\n",a); printf("%d\n",b); return 0; }
6.数组作为函数参数
#include <stdio.h> //int arr[] 数组名作为函数参数会退化为指针 //数组名本身就是一个地址 指向数组的首地址 void BubbleSort(int* arr,int len) { int i,j; int temp; for(i=0;i<len-1;i++) { for(j=0;j<len-i-1;j++) { if(arr[j]>arr[j+1]) { temp = arr[j]; arr[j] = arr [j+1]; arr[j+1]=temp; } } } return; } int main() { int i; int arr[]={8,1,5,9,2,10,6,3,7,4}; BubbleSort(arr,10); for(i=0;i<10;i++) { printf("%d\n",arr[i]); } return 0; }
7.函数返回值为指针类型
#include <stdio.h> int a = 10; int* test() { return &a; } int main() { int* p = test(); printf("%p\n",p); printf("%p\n",&a); printf("%d\n",*p); printf("%d\n",a); return 0; }
8.指针和数组
8.1
#include <stdio.h> int main() { int arr [] ={1,2,3,4,5,6,7,8,9,10}; //数组名是数组的首地址 是一个常量 printf("%p\n",&arr[0]); printf("%p\n",arr); return 0; }
8.2
#include <stdio.h> int main() { int arr [] ={1,2,3,4,5,6,7,8,9,10}; //在将数组赋值给指针变量时,不需要取地址操作 本身就是地址 int * p; p = arr; printf("%d\n",arr[0]); //通过指针间接操作数组 printf("%d\n",p[0]); //int* 指针+1 内存地址相当于 +sizeof(int); printf("%d\n",*(p+1)); return 0; }
8.3指针当做数组操作
#include <stdio.h> int main() { int i; int arr [] ={1,2,3,4,5,6,7,8,9,10}; //在将数组赋值给指针变量时,不需要取地址操作 本身就是地址 int * p; p = arr; for(i=0;i<10;i++) { printf("%d ",*(p+i)); if(*(p+i) ==10) { printf("\n"); } } for(i=0;i<10;i++) { //指针加上偏移量 printf("%d ",*(p+i)); } return 0; }
8.4 指针减法
#include <stdio.h> int main(void) { int step; char ch [] ="hello world"; //指向o字符元素 char* p = &ch[4]; //ch数组名默认指向第一个数组下标 step = p -ch; printf("%d\n",step); return 0; }
9.指针数组
#include <stdint.h> int main() { int i; int a = 10; int b = 20; int c = 30; //指针数组 指针类型的数组 int* arr[3] ={ &a,&b,&c}; //指针数组存储指针变量 *arr[2] = 123; for(i=0;i<3;i++) { printf("%d\n",*arr[i]); } return 0; }
10.多级指针
#include <stdio.h> int main() { int a = 10; int b = 20; //使用一级指针接收变量地址 int* p =&a; int* q =&b; //使用二级指针接收一级指针的地址 int** p1 = &p; printf("%d\n",**p1);//-->10 *p1 = q;//间接改变一级指针的值 printf("%d\n",**p1);//-->20 **p1 = 123;//二级指针间接改变变量的值 printf("%d\n",**p1);//-->123 return 0; }