带你快速了解C语言【指针进阶】

目录

一.指针

二.字符指针

三.指针数组

四.数组指针 

1.数组指针的使用

四.数组参数、指针参数

1.一维数组传参

2.二维数组传参

3.一级指针传参

4.二级指针传参

五.函数指针.

六.函数指针数组.


一.指针

指针是什么呢?

简单的理解,指针就是一个变量,用来存放地址。而指针变量的大小在32位机器上是4字节,在64位机器上是8字节。

带你快速了解C语言【指针进阶】_第1张图片

这里的指针pa就存放了a的地址。

二.字符指针

字面上来理解,就是指向字符的指针。

带你快速了解C语言【指针进阶】_第2张图片

带你快速了解C语言【指针进阶】_第3张图片

如果要存放字符串的话,就有一些注意事项了。


    char arr[] = "zlsrosy.";  //1
    char brr[] = "zlsrosy.";  //2
    const char *crr = "zlsrosy."; //3
    const char *drr = "zlsrosy."; //4

1和2:分别开辟了arr1和brr2两块空间,并用zlsrosy.初始化。所以str1和str2的地址并不相同。

带你快速了解C语言【指针进阶】_第4张图片

3和4:首先这里有一个zlsrosy常量字符串,它已经存在了内存中了。之后我们用crr,drr指针指向了这个常量字符串。所以crr和drr的地址是相同的。

带你快速了解C语言【指针进阶】_第5张图片

三.指针数组

它是存放指针的数组

int* arr[10];     首先它是一个有10个元素的数组,每个元素是int*类型的。

char* arr[10];     首先它是一个有10个元素的数组,每个元素是char*类型的。

char**arr[10];   首先它是一个有10个元素的数组, 每个元素是char**类型的。

四.数组指针 

与指针数组不同,数组指针是一种指针,他指向数组。 

int* arr[10]                 它是一个指针数组

int (*arr)[10]         它是一个数组指针

看出区别了吗?

*如果先和arr结合,代表它是一个指针,如果它先和int结合,代表它是一个数组,这就涉及到了优先级的问题。[ ]的优先级> *。 

1.数组指针的使用

带你快速了解C语言【指针进阶】_第6张图片

带你快速了解C语言【指针进阶】_第7张图片

传参数组名arr,代表首元素地址。这里的首元素是arr【0】是二维数组的第一行。

所以传递的arr是第一行的地址,是一个一维数组。 

四.数组参数、指针参数

1.一维数组传参

#include 
void test(int arr[])// 传整形数组,用数组接收 ok.
{}
void test(int arr[10])// 同上.
{}
void test(int *arr)// 传整形数组,arr代表数组首元素地址,用整形指针arr接收 ok. 
{}
void test2(int *arr[20])//传指针数组,用指针数组接收 ok.
{}
void test2(int **arr)// 传一级整形指针数组,数组名表示首元素地址,用二级指针接收  ok.
{}
int main()
{
 int arr[10] = {0};
 int *arr2[20] = {0};
 test(arr);
 test2(arr2);
}

2.二维数组传参

void test(int arr[3][5])// 传二维数组,接收用二维数组 ok.
{}
void test(int arr[][])// 传二维数组,接收时没有指定列 err.
{} 
void test(int arr[][5])// 传二维数组,指定了列,ok.
{}
void test(int *arr)// 传二维数组,数组名表示首元素地址,int*arr只接收了第一行 err.
{}
void test(int* arr[5])//传二维(整形)数组,用指针数组接收,err.
{}
void test(int (*arr)[5])//传二维数组,用数组指针接收,ok.
{}
void test(int **arr)//传二维数组,数组名表示首元素地址,int**arr是地址的地址,err.
{}
int main()
{
 int arr[3][5] = {0};
 test(arr);
}

3.一级指针传参

void test1(int *p)
{}
//test1函数能接收什么参数?
void test2(char* p)
{}
//test2函数能接收什么参数?




int main()
{
    int a=0;
    int*pa=&a;
    int arr[5]={0};
    char b=0;
    char*pb=&b;
    char brr={0};
    test1(&a);
    test1(pa);
    test1(arr);
    test2(&b);
    test2(pb);
    test2(brr);
    
}

4.二级指针传参

void test3(int**arr)
{};
//可以传什么参数?


int main()
{
  int **ptr;
  int *pp;
  int*arr[10];  //指针数组
  
  test3(ptr);
  test3(&p);
  test3(arr);
}

五.函数指针.

指向函数的指针

void swap(int *a,int*b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

int main()
{
	int a = 1;
	int b = 2;
	swap(&a,&b);
	void (*arr)() = swap;     //函数指针

}

(*arr)代表它是一个指针,void是函数swap的返回类型,()代表它是一个函数。 

六.函数指针数组.

它是一个数组,里面的数据全是函数指针,用于集合函数

int add(int a,int b)
{
	return a + b;
}

int sub(int a, int b)
{
	return a - b;
}

int main()
{
	int a = 1;
	int b = 2;
	add(a,b);
	sub(a, b);
	int (*arr[2])(int x,int y) = { add,sub}; //函数指针数组

}

你可能感兴趣的:(C语言,c语言,c++,数据结构)