c指针学习小结(参考别人总结的经验)

指针学习与总结
一、
1.int *p :p与*先结合,说明p是一个指针,然后与int结合说明指向的是一个int型的。
2.int p[3] :p与[]结合说明p是一个数组,然后与int结合,说明数组里的元素是int型的。
3.int *p[3]: p与[]结合说明p是一个数组,后与*结合,说明数组的指针,后与int型结合,说明指针指向的是int型的。
4.int (*p)[3] :p与*结合,说明p是一个指针,后与[]结合说明指向的是一个数组,与int结合说明数组的元素是int型。
5.int **p :p与*结合,说明p一个指针,指向的类型是int *,与*再结合说明*p是一个指针,再与int结合,说明*p指向的是int型。
6.int p() :p与()结合,说明p是一个函数,再也int结合说明返回值是int型。
7.int(*p)(int) :p与*结合说明p是一个指针,与()结合,说明指向的是一个函数,再与int结合说明返回值是int型。
8.int *(*p(int))[3]: p与()结合,说明p是一个函数,与*结合说明返回值是一个指针,指向的类型是int* [3],再与[]结合,说明指向的是一个数组,再与*结合,说明数组里存放的是一个指针,再与int结合,说明
数组的指针指向元素是int型的。
二、
指针的类型,指针指向的类型,指针的值或者指针所指向的内存区,指针本身所占据的内存区
指针的类型:去掉指针名即是。int *ptr 指针的类型是int*;

    数组与指针的typedef:考虑typedef是类型的重命名,注意是类型不是指向的类型,对指针类型重命名typedef char* PCHAR;//PCHAR是char * 的别名。
    typedef char ARRAY[10];//ARRAY的类型是char [10], ARRAY a;//定义char a[10]
    函数的typedef:typedef int (*PFUN)(int a);//PFUN是一个函数指针
    int printa(int a){printf("a = [%d]",a);}
    PFUN pf ;
    pf = &printa;
    (*pf)(1);


指针指向的类型:去掉指针名和左面的*即可,int **ptr 指向的类型是int*;
指针的值或者指针所指向的内存区:在32位机器中, 所有类型的指针的值都是一个32位的整数,指针所指向的内存区就是从指针所代表的的那个地址开始,长度为sizeof(指针指向的类型)的一片内存区。

三、指针的运算
char a[20];
int *p = (int*)a;
p++;//这里p++之后,p指向下一个int,一般32位机器,即指向了a[4],即p加上了sizeof(int)
测试代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){

char a[34] = "abcdefg1234567890";
int i ;
int *p = (int *)a;
p++;
for(i=0;i<5;i++)
{
printf("%d ",&a[i]);
}
printf("========%d ",p);
}

code 2 to understand:
int main(){

char a[34] = "abcdefghij1234567890";
char *p = a;
char **pp = &p;

//强制理解,把指针看作一个变量,存放的是地址
printf("%d ",p);//1
printf("%d ",a);//同1
printf("%d ",pp);//2
printf("%d ",&p);//同2
printf("%d ",*pp);//同1 pp->p ->a则pp = &p, p = a; *pp = p

printf("%c ",**pp);
printf("%c ",*p);

}

understand 3:
int a = 12; int b ; int *p ; int **pp;
p = &a;
*p = a;
pp = &p;
*pp = &b;
**pp = a;
四、数组与指针
int a[10] = {1,2,3,4,5,6,7,8,9,0};
*a //*(a+0) 1
*(a+2) // 3
五、指针与函数的关系
int f(){
printf("this is f. ");
return 1;}
int main()
{
int (*pf)();
pf = &f;//pf = f也可以? 函数f内存中直接是地址?
pf();
}
六、指针的类型转换

int a = 10;
int b;
char *str;
int *ptr;
ptr = &a; // ptr -> a ,ptr存a的地址
printf("%d ",ptr);
printf("%d ",&a);
b = (int)ptr;
printf("%d ",b);
str = (char *)b;str -> b,由于b是int,str是字符串,所以要进行强制转换
printf("%d ",str);
ptr =(int *)&c;
printf("%d ",ptr);
printf("%d ",&c);

/**************************
别人的建议数据结构吧,算法才
是永恒的,程序设计语言层出不穷,永远学不完。学完之后就认真啃
下STL这根骨头吧,推荐书籍--------范型编程与STL和STL源码剖析。
**************************/


原文地址:https://www.cnblogs.com/ashen/p/4470480.html