带你快速了解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