带你快速了解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语言之指针进阶-创新互联
浏览地址:https://www.cdcxhl.com/article48/ddegep.html

成都网站建设公司_创新互联,为您提供服务器托管电子商务网站维护标签优化小程序开发定制开发

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都网页设计公司