带你快速了解C语言之指针进阶-创新互联

目录

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名注册、网页空间、营销软件、网站建设、会同网站维护、网站推广。

一.指针

二.字符指针

三.指针数组

四.数组指针 

1.数组指针的使用

四.数组参数、指针参数

1.一维数组传参

2.二维数组传参

3.一级指针传参

4.二级指针传参

五.函数指针.

六.函数指针数组.


一.指针

指针是什么呢?

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

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

二.字符指针

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

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

  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的地址并不相同。

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

三.指针数组

它是存放指针的数组。

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

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

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

四.数组指针 

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

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

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

看出区别了吗?

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

1.数组指针的使用

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

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

四.数组参数、指针参数 1.一维数组传参
#includevoid 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}; //函数指针数组

}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


名称栏目:带你快速了解C语言之指针进阶-创新互联
本文地址:http://azwzsj.com/article/ddegep.html