指针数组、数组指针、指针函数、函数指针的简单介绍

一.指针数组:本质是一个数组,里面存放的元素是指针。例如:char *nums[10];定义了一个名称为num 长度为10的存放元素为:指向char类型数据的指针变量的数组。数组中的每个元素都是一个指针,每个指针都可以指向一个字符串。

在程序中举例:

int main(int argc, const char * argv[]) {

// 指针数组就是用来表示字符串的数组

char *strs[10];

// 声明了一个数组, 允许存储 10 个字符串

// 每一个字符串

strs[0] = "1234";

strs[1] = "你好";

// ...

strs[9] = "hello iOS";

return 0;

}

指针数组和二维数组的区别:

1.    二维数组赋值必须使用for循环或者strcpy()函数进行赋值,而指针数组可以直接赋值。如;arr1[]=”qazwsx”;

2.    二维数组赋值之后可以更改,但是指针数组赋值之后不能更改。

数组指针:本质是一个指针,指向一个数组的指针变量(变量中存放的地址就数组的地址。)

3.    数组的长度一旦定义后就确定,分配的内存也被确定不可修改。如果字符串分配到数组之后长度太小就会浪费空间,如果太大,字符串就盛不下,但是指针不会。如下图:

二.数组指针:本质是一个指针,指向一个规定长度的数组。

定义:如 int (*p)[10];

int 指的是指针指向的数组的元素的类型。(*p)指的是定义一个名称是p的指针变量名。[10]指的是指针指向的数组的长度。此时定义了一个指针变量 p, 该变量指向一个长度为 10 的元素为 int 类型的数组。

例如:

int main(int argc, const char * argv[])

{

int(*p)[10]="1 2 3 4 5 6 7 8 9 0";

printf("%s",*p);

return 0;

}

拓展:int *(*p)[10]。指的是定义了一个指针型变量p,指向一个长度为10存放指针类型元素的数据。

三.指针函数:本质是一个函数。返回值为指针。

Int *function(参数)

{

…………

}

对于这种函数,一定要慎用,举个例子,给出一段同事之前出现错误的代码:

int *func() {

intarr[] = {1,2,3,4};

return arr;

}//这是很危险的做法,在这里开辟的函数存在栈里面,函数结束后内存收回。很容易出 bug。除非手动开辟内存,或者开发者对当前内存分布情况比较深入。

四.函数指针:本质上是一个指针。指向函数的指针,也就是说该指针变量存放的是函数的地址。

核心意义:使用一个变量存储一个函数,然后利用变量调用函数

语法:

例如定义一个有两个参数,一个int返回值的函数:int strcmp(char *, char *)。定义它的函数指针:int (*p)(char*, char *);只需要将函数名称去掉换上(*p)就可以了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 11:50:50

指针数组、数组指针、指针函数、函数指针的简单介绍的相关文章

数组、函数和指针

一.数组和指针 数组名同时也是该数组首元素的地址.例如:flizny == &flizny[0] , flizny 和 &flizny[0]都代表首元素的内存地址,两者都是常量: 指针+1的结果就是对该指针增加一个存储单元,对于数组而言,地址会增加到下一元素的地址,而不是下一个字节. 可以用以下等式表示: dates + 2 == &date[2] // 相同的地址 *(dates + 2) == dates[2] //相同的值 二.函数和指针 由于数组名就是数组首元素的地址,所以

指针 指针与数组 指针与字符串 指针与函数 结构体与指针 宏

指针 指针与数组 指针与字符串 指针与函数?? 指针与数组 1.数组名:数组元素首地址 eg: int array[3]={1,3,6}; 这里array 恒等于&array[0] 2.int *p = a; int *p = 0; int a[]={0}; 3.int *p = a; 均指向数组的首地址 *p是? *(p+1)是?(*p)+1是? *(p+1)决定向下移动几个字节是类型 4.指针可以当数组名使用 p[1] = 3; 恒等于a[1] ;恒等于*(p+1);恒等于*(a+1) 5.

c/c++ 函数、常量、指针和数组的关系梳理

压力才有动力,15年中旬就要准备实习,学习复习学习复习学习复习学习复习……无限循环中,好记性不如烂笔头……从数组开始,为主干. c 的array由一系列的类型相同的元素构成,数组声明包括数组元素个数和类型,c 中的数组参数是引用形式传参(传址调用),而常量标量是按值传递. //[]方括号表示声明的是数组,里面的数字表明了数组包含的元素数目 int states[50];//声明50个整数的数组 double code[365];//声明365个浮点数的数组 char chr[20];//声明20

指向函数的指针数组的用法

声明一个指向函数的指针数组,并通过指针调用函数. #include<stdio.h> void f1();//函数f1的声明 void f2();//函数f2的声明 void f3();//函数f3的声明 void main() { void (*f[3])()={f1,f2,f3};//指向函数的指针数组的声明 int flag; printf("请输入一个1,2或者3.输入0退出.\n"); scanf("%d",&flag); while(

指针数组,数组指针,指针函数,函数指针

1.指针数组:顾名思义,指针数组就是数组里面元素都是指针,代码如下: #include <stdio.h> int main(int argc, const char * argv[]) { // insert code here... //printf("Hello, World!\n"); int a=1,b=2;//先定义两个变量 int *p[]={&a,&b};//然后定义数组,数组元素都是指针 printf("%p\n",p[

四 指针与数组 五 函数

四 指针与数组 <一> 指针  就是地址 1 定义 int *p; 2 初始化 int a,*p=&a; 把a的地址给*p 指针变量有了谁的地址就是指向谁.则*p就代表了这个变量.*p代表 a 3 操作 int a ,*p=&a; *p=5;        <-----把5赋值给了a int *p,a; *p=[*&]a; | 抵消了 *p <=>a 等价 注意 : * 三个用途  1 乘法运算 2 取值运算符 3 说明符 定义时候用到 如 int a

C 函数、指针和数组

C中经常要写一个对数组进行操作的函数,下面介绍一下,数组.指针和函数的应用: 指针和数组: #include <stdio.h> #include <stdlib.h> int sum(int *ar,int n); int main() { int a[10]; int n=5,i; for(i=0;i<n;i++){ scanf("%d",&a[i]); } printf("%d",sum(a,n)); return 0;

c/c++ 函数指针 指针函数 数组的引用 指针数组 数组指针

1.指针数组数组指针 引用数组 数组的引用 int *a[10] 指针数组 每一个元素都是一个指针 Int (*a)[10] 数组指针 P指向一个含有10个元素的数组 Int (&a)[10] 数组的引用 a是一个数组的引用 Int& a[10] 引用函数 非法 数组的引用:1.在程序体中 int a[10]; Int (&p)[10]=a;//引用数组 2.作为参数 #include <iostream> #include <string> using n

【ThinkingInC++】18、指向函数的指针数组

/** * 功能:指向函数的指针数组 * 时间:2014年8月14日07:24:46 * 作者:cutter_point */ #include<iostream> #include<cstdlib> using namespace std; //这里N就是函数名,而DF(N)就代表了后面的N函数,N可以变 #define DF(N) void N() {cout<<"function "#N" is called"<<

[C++]数组指针,数组引用,函数指针

数组指针是指一个指向数组的指针,例如有一个数组指针p指向一个数组a[],则 *p是取到这个数组,也就是说 *p=a,因此 **p =a[0], 它的定义为: int a[10]; int (*c)[10]=&a; (*c)表示它是一个指针,若不加括号则变成 指针数组 ,[10]表示指向一个长度为10的数组,int 表示数组元素为int 因为函数不能返回数组,所以可以设置返回一个数组指针,即 auto fo2(int (&a)[10]) -> int (*)[10]{ a[5]=10;