C-【指针】

目录:

1.指向变量                          4.指向函数

2.指向数组(遍历各元素)         5.指向结构体

3.指向字符串                       6.空指针

______________________________________

指针中最重要的一点:

p代表指针本身,一般存放的是地址

*p则是出发到源数据域,等价于其指向的变量


1.指向变量
int  main()
{
    int a=10;
    int b=15;
    test(&a,&b);
    printf("a=%d,b=%d\n",a,b);
    return 0;
}
void test(int * x,int *y)
{
    int tmp;
    tmp=*x;
    *x=*y;
    *y=tmp;
}

结果:    a=15,b=10

原因:利用指针访问变量的存储单元,间接修改变量的值。

注意:

void main(){
    int *p,n=123;
    p=&n;
    printf("%d",p);
}

若输出是p,是输出内存中 指针位置所存储的地址。

若输出是*p,则直接寻址到指向的变量位置,然后输出变量。


2.指向数组(遍历数组各元素)

【一维数组】

int  main()
{
    int array[5]={2,5,12,7,8};
    int *p =array;
    for(int i=0;i<5;i++)
    {    printf("array[%d]=%d\n",i,*(p+i));    }
    return 0;
}

解析:

(1)数组名就是数组的(首)地址,即*p=2。

(2)如果把(p+1),那么指针变量就指向了数组的下一个元素5。


【二维数组】

static int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
int(*p)[4];
int i,j;
p=a;
for(i=0;i<3;i++)
for(j=0;j<4;j++){printf("%2d ",*(*(p+i)+j))};

解析:

(1)指针中,通常*是优先级最低的识别符号。

(2)*(p+i)+j是二维数组i行j 列的元素的地址,而*(*(p+i)+j)则是i行j列元素的值。


【数组的一种特殊写法:(查找数组中有无'k')】

main(){
    char st[20],*ps;
    int i;
    printf("input a string:/n");
    ps=st;
    scanf("%s",ps);
    for(i=0;ps[i]!='/0';i++)
    if(ps[i]=='k'){
        printf("there is a 'k' in the string/n");
        break;
    }
    if(ps[i]=='/0') printf("There is no 'k' in the string/n");
}
main(){
    char *pa="CHINA",b[10],*pb;
    pb=b;
    cpystr(pa,pb);
    printf("string a=%s/nstring b=%s/n",pa,pb);
}

解析:

(1)唯有数组输出的时候,指向它的指针能够不带*而加上[i]。


3.指向字符串
 char *pc="C Language"

解析:

(1)原理与数组类似,指针变量指向字符串的首个字符。

(2)可以依次访问字符串的各个字符。

(3)这里意思是,指针pc指向一个存放"C Language"的位置,而不是为指针赋值。


main(){
    char *ps="this is a book";
    int n=10;
    ps=ps+n;
    printf("%s/n",ps);
} //对字符数组作初始化赋值,必须采用外部类型或静态类型,如: static char st[]={“C Language”}。若非静态,只能逐个赋值。

解析:

(1)ps指向存储数组的首内存。

(2)ps+10后,是地址+10

(3)因为数组特性,数组的输出是一直自动输出到结尾。

         所以这里输出会是"book"。



4.指向函数
int main()
{
    int a=5;
    int b=6;
    int (*p)(int,int);
    p=sum;
    int result=(*p)(a,b);
    printf("The result is %d\n",result);
    return 0;
}
int sum(int x,int y)
{    return x+y;    }

解析:

(1)(*p)(a,b)可以用p(a,b)来代替,因为p和sum就是一样的。


【指针函数】:

int *ap(int x,int y)
{
...... /*函数体*/
}

解析:

(1)表示ap是一个返回指针值的指针型函数, 它返回的指针指向一个整型变量。

(2)用法示例

main(){
    int i;
    char *day_name(int n);
    printf("input Day No:/n");
    scanf("%d",&i);
    if(i<0) exit(1);
    printf("Day No:%2d-->%s/n",i,day_name(i));
}
char *day_name(int n){
    static char *name[]={ "Illegal day","Monday","Tuesday","Wednesday",
                            "Thursday","Friday","Saturday","Sunday"};
    return((n<1||n>7) ? name[0] : name[n]);
}

5.指向结构体
struct student
{
     char *name;
      int  ages;
};
struct student stu={"Rose",15};
struct student *p;
p=&stu;

解析:

可以有3种方式来访问结构体中的属性ages。

stu.ages=15;
(*p).ages=15;
p->ages=15;

注意:

第三种方法(->)只能用来指向结构体。



6.空指针
#define NULL 0 
void main(){
    int *p=NULL;
}

解析:

(1)指针变量未赋值时,可以是任意值,是不能使用的。否则将造成意外错误。

(2)而指针变量赋0值后,表明它是空指针。可以使用,只是它不指向具体的变量而已。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值