C语言指针篇(上篇)CSDN花神生涯

it2023-11-16  68

文章目录

指针指针的基本概念指针变量指针运算指针+-整数指针-指针指针的关系运算 二级指针字符指针数组指针指针数组函数指针指针函数数组参数指针参数


指针

指针的基本概念

指针是C语言中的一种重要数据类型,利用指针变量,可以表示各种复杂的数据结构计算机中所有的数据都是放在存储器中,一般把存储器中的一个字节称作一个内存单元为了正确的找到该内存单元,必须为每个内存单元编号,根据一个内存单元的编号,即可准确的找到该内存单元,内存单元的编号称为地址,也称作指针通过指针能找到以它为地址的内存单元指针的大小在32位平台是4个字节,在64位平台是8个字节指针类型决定了指针进行解引用操作的时候,能够访问空间的大小。int 4个字节。char 1个字节,double 8个字节指针类型决定了:指针走一步走多远指针是一个常量

指针变量

单元的地址就是指针,存放的数据才是该单元内容允许用一个特殊的变量来存放指针,这种特殊的变量就称为指针变量变量的指针就是变量的地址,存放变量地址的变量就是指针变量C语言中,用“ * ”符号表示”指向“指针变量的定义: 类型说明符 *变量名; int *p1; 指针的运算符:&变量名;取地址运算符 *变量名;取内容运算符指针变量使用前不仅要定义,而且必须赋予具体的值,未经赋值的指针变量不能使用,未赋值的指针变量叫做野指针int * p=NULL;叫做指针初始化不允许把一个具体的整数赋给指针变量 int *a; a=100; 被赋值的指针变量前不能加“ * ”指针变量的定义和赋值: int a; int *p=&a;//指针变量初始化 int *p; p=&a;//使用赋值语句

指针运算

指针±整数
int main() { int arr[10]={1,2,3,4,5,6,7,8,9,10} int i=0; int sz=sizeof(arr)/sizeof(arr[0]) int* p=arr;//指针得到数组首元素地址 for(i=0;i<sz;i++) { printf("%d",*p)//输出指针内容 p=p+1;//指针变量向后移动,也可以写成p++; } return 0; }
指针-指针
int main() { int arr[10]={1,2,3,4,5,6,7,8,9,10} printf("%d"&arr[9]-&arr[0]);//得到的是指针与指针之间的元素个数 return 0; }
指针的关系运算
#define N_VALUES 5; float values[N_VALUES]; float *p; for(p=&value[[N_VALUES];p>&values[0];)//地址小于首地址,进入循环 { *--p=0//先--再赋0 } //标准规定,允许数组元素指针和数组最后一个元素后面的内存位置比较,但不能与第一个元素指针前面的内存位置进行比较,故尽量选第一种方法 for(p=&value[[N_VALUES];p>&values[0];p--)//地址小于首地址,进入循环 { p=0}

二级指针

int main() { int a= 10; int* p=&a;//p就是一级指针,申请新空间,存放a的地址 int** pp=&p//pp就是二级指针,存放p地址 printf("%d\n",**pp)//*pp先找到p然后对p进行解引用操作:*p找到a }

字符指针

int main() { char arr[]="nihao"char* pp="nihao";//字符指针pp printf("%d\n",*pp);//输出指针的内容 printf("%d\n",arr);//值一样 char* o="niaho"//常量字符串 printf("%s\n",o);//打印nihao }

判断输出内容

int main() { char arr[]="nihao" char arr1[]="nibuao" char *p1[]="nihao" char *p2[]="nihao" if(arr1==arr)//不同空间的数组,首地址自然不同,所以不相等 printf("niaho"); else { printf("你不好") } if(p1==p2)//指向常量,不可修改,二者公用一份,都指向同一空间 printf("hh"); else { printf("nomm") } }

数组指针

是个指针,能够指向数组的指针,存放数组的地址 &arr[0]//首元素地址 arr //大多数情况 数组名 是首元素地址,但有两个另外 &arr//&数组名-数组名不是首元素的地址-数组名表示整个数组,取出整个数组的地址 sizeof(arr//数组名表示整个数组,计算的是整个数组的大小 int main() { int *p=NULL;//空指针 int arr[10]={1,2,3,4,5,6,7,8,9,10} int(*p)[10]=&arr } //数组的地址要存起来, //不加括号,p会先和[]结合,形成数组, //加上括号让*和p先结合,此时的p先形成指针, //再加上后面[10]指向数组, //加上前面的数组元素类型(可能是char也可能char*等),形成数组指针 int arr[5];//arr是一个5个元素的整型数组 int *arr[5];//arr是一个指针数组,数组有5个元素,每个元素的类型是int* int (*arr)[5];//arr是一个数组指针,该指针指向一个数组,数组上有5个元素,每个元素的类型是interesting int (*arr[10])[5];//arr是一个数组,该数组有10个元素,每个元素是一个数组指针,该数组指针指向的数组有5个元素,每个元素类型是int

数组指针的使用

int main() { int arr[10]={1,2,3,4,5,6,7,8,9,10} int (*pa)[10]=&arr; int i=0; for(i=0;i<10;i++) { printf("%d\n",(*pa)[i]))//方法一:输出数组内容,*pa=arr printf("%d\n",*(*pa+i));//方法二:输出数组内容, } }

指针数组

是个数组,存放指针的数组 int a=10; int b=10; int c=10; int* arr[3]={&a,&b,&c};//存放指针的数组 //int* arr[]={arr1,arr2,arr3}存放指针的数组 int i=0; for(i=0;i<3;i++) { printf("%d\n",*(arr[i]));//输出10 20 30 }

函数指针

指向函数的指针,将函数名(也就是函数的首地址或称入口地址)赋给一个指针变量,是该指针指向该函数,这个指针变量称为 " 函数指针变量"

在函数中 &函数名 和 函数名 都是函数地址函数指针变量不能进行算数运算函数指针的移动毫无意义,数组指针变量移动,可使其指向后面或前面的数组元素 //定义形式和入口地址的赋予: 类型说明符 (*指针变量名)()=函数名;: int(*pa)(int int)=函数名; //调用:(*指针变量名)(实参表); 例:printf("%d\n",(*pa)(2,3)); 例:int(*pa)(2,3)=z;printf("%d\n",z);

指针函数

int *p();//p是返回整型指针的函数→本质是函数

数组参数

一维数组传参

void test(int arr[])//传过来的是个数组,接受也为数组,大小不指定也ok {} void test(int arr[10])//传过来是个数组,接受也为数组,指定大小也ok {} void test(int *arr[])//传过来数组,接受为整型指针也ok {} void test2(int *arr[20])//传过来的是个数组,接受也为数组,每个元素为int * {} void test2(int **arr[])//int * 一级指针的地址,传过来放在二级指针中,但切记不能传过来数组ok {} int arr[10]={0}; int *arr2[20]={0}; test(arr); test2(arr2);

二维数组传参

二维数组传参,函数形参的设计只能省略第一个【】的数字二维数组首元素地址是第一行地址 void test(int arr[3][5])//可行 {} void test(int arr[][5])//可行 {} void test(int arr[3][])//不可行,可以不知道多少行,但得知道一行多少个元素 {} void test(int *arr)//不可行 {} void test(int **arr)//不可行 {} void test(int *arr[5])//不可行 {} void test(int (*arr)[5])//可行,指针指向5个数组 {} int mian() { int arr[3][5]={0}; test(arr);//二维数组传参 return 0; }

指针参数

一级指针传参

#include <studio.h> void print(int *p,int sz) { int i=0; for(i=0;i<sz;i++) { printf("%d\n",*(p+i)) } } int main() { int arr[10]={1,2,3,4,5,6,7,8,9}; int *p=arr; int sz=sizeof(arr)/sizeof(arr[0]) print(p,sz);//一级指针p,传给函数print return 0; } void print(int *p) {}//当形参是指针时,实参可以传变量取地址,或者存放地址的一级指针 69544· int mian() { int a=10; int *p1=&a; test(&a) test(p1) }

二级指针传参

#include <studio.h> void test(int **pt)//当参数为二级指针时 { printf("%d\n",*(p+i)) } int main() { int a=10; int *p1=&a; int **pp=&p1; test(&p1);//一级指针的地址也是二级指针,ok test(pp);//传二级指针参数,ok int* arr[10];//存放一级指针的地址 test(arr);//传指针数组也可以 }

花神博客生涯之C语言(指针篇)结束了哦~ 接下来会持续更新(⊙o⊙)!

最新回复(0)