黑马程序员技术交流社区
标题: 数组指针与指针数组的剖析 [打印本页]
作者: jeffdy66 时间: 2015-11-10 21:47
标题: 数组指针与指针数组的剖析
1.什么是指针数组?
答: 是一个数组,用来存储指针的数组就叫指针数组,数组里面的元素都是指针
int *p[3] 表示定义了一个可以存三个int指针的数组,
赋值:int a1=1,a2=2;a3=3; int *p[3]={&a1,&2,&3}; 取值 *p[0]
p[0]=p1; p[1]=p2; p[2]=p3 ;
2.什么是数组指针?
表示一个指针,而这个指针类型是数组
int (*p)[3] 表示这是一个含有三个元素的int数组的指针
赋值:int arr[3]={1,2,3} ; int (*p)[3]=&arr ;
3.什么是数组元素的指针?
表示一个指针,而这个指针存的是数组一个元素 的地址, int arr[1]={1},i nt *p =&arr[0];
int arr[3]={1,2,3};
int *p=arr;
int a=*p;
file:///var/folders/7s/53j_mjm930s7x181zrnk6r3c0000gn/T/WizNote/b1671f48-b452-4020-9017-74d99bb0f093/index_files/b0d5f9e1-bc35-41ca-bafa-499d2778810d.png
// a=*(p+1) 等效于 : int * p1=&arr[1] ; a=*p1 ???
4.有什么特点:
1, 数组名表示第一个元素的地址,&数组名表示整个数组的地址,二者值相同,但意义不同
2. 指针可以运算,但仅限于加减运算,运算的实质就是地址运算,即地址的移动.
3.地址(+1)向高位移动,而(-1)向低位移动,不同指针类型移动一位,加1或减1的字节数不同, 指针不受
4. 实际移动的字节数看指针类型,类型占多少个字节,一位就移动多少个字节.
如何看类型, 结合优先级,变量类型 去掉变量名就是int 类型 , 指针类型 去掉星星.
int arr[3]=[3,4,5};
int *p=arr; // 表示数组元素的指针(首元素)
int (*parr)[3]=&arr; // 整个数组的地址
int *arrp[2]={&arr[0],&arr[1]};
int temp=*(arrp[0]); // 取a[0]的地址 为3
printf("%d\n",temp);
file:///var/folders/7s/53j_mjm930s7x181zrnk6r3c0000gn/T/WizNote/b1671f48-b452-4020-9017-74d99bb0f093/index_files/a38ec688-1ca4-4822-b39f-f2626e1fbdb1.png
5.什么是二维指针数组?
答:是一个数组,里面的每一个子数组存的元素的类型是指针.
int *pa=&a ,*pb=&b, *pc=&c, *pd=&d,*pe=&e,*pf=&f ;
int *p[2][3]={{pa,pb,pc},{pd,pe,pf}}
int *ptemp=p [1][1];
printf("pe=%p,ptemp=%p\n",pe,temp);
p[1][1]
6.什么是二维数组的指针?
答:是一个指针,只是指针类型是二维数组
int arr[2][3]={{1,2,3},{4,5,6}};
int (*p)[2][3]=&arr // 这就是一个二维数组的指针
6. 指针与字符串
堆区存储用户手动申请的内存数据,如果用户不释放会一直存在,容易内存泄露.
a.怎么表示一个字符串?
char arr[]="heima";
b.怎么表示一个字符串数组?
char arr[2][6]={"itcast","heima"};
c.怎么用指针表示一个字符串数组?
char *arr[2]={"itcase","heima"};
7.有什么特点?
d.指针定义的字符串是常量,不能被改变,而字符数组定义的是变量,可以被改变.
e.指针定义一个字符串,指针存的实际是在常量取的那个字符串的首字符的地址.
file:///var/folders/7s/53j_mjm930s7x181zrnk6r3c0000gn/T/WizNote/b1671f48-b452-4020-9017-74d99bb0f093/index_files/8aaff5fd-ae6f-4e12-ac72-7525fd791b5f.png
file:///var/folders/7s/53j_mjm930s7x181zrnk6r3c0000gn/T/WizNote/b1671f48-b452-4020-9017-74d99bb0f093/index_files/f4b2e27a-fbe5-404e-a007-23f817d9e75d.png
常量区的常量与变量区别?
答; 常量区的常量只有一份,也就是重用的时候,用的都是同一个,地址一样.
1.而变量同一个字符串,不同的变量地址
2.指针定义一个字符串,指针存的实际是在常量区的那个字符串的首字符地址.
3.指针定义的字符串是常量,不能被改变,而字符数组定义的是变量,可以被改变.
8.什么是指针型函数?
答:这个函数的返回值类型是指针
定义:类型*函数名(参数){return 指针类型}
如: int * add(int *a) {return &a}
表示定义了一个返回值是int指针类型的add函数.
9. 什么是函数指针?
函数也会在内存开辟一块空间,函数指针即这块空间的地址.
10.有什么特点?
1.函数指针做加减运算可以,没有什么意义.
2.函数指针可以当作参数传递,因为是一个指针类型.
3.不管什么类型的指针,只要是指针,其里面存的就是地址.
file:///var/folders/7s/53j_mjm930s7x181zrnk6r3c0000gn/T/WizNote/b1671f48-b452-4020-9017-74d99bb0f093/index_files/67f067af-137c-43ec-8036-c4bf28e825a2.png
作者: wh8817221 时间: 2015-11-10 22:17
写得不错,上课肯定认真笔记了
作者: jeffdy66 时间: 2015-11-10 23:55
哈哈, 不记这玩意看不透,好记性不如烂笔头
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |