c语言指针相关概念

1.指针的概念

指针是什么?指针是变量,里面存放的是地址,如果定义了一个指针变量,而不赋给地址,会出现“段错误”


2.指针的常见用法

 一个整型数 :int  a;
指向一个整型数的指针: int  *a;
一个指向指针的指针,这个指针指向的是整型数: int  **a;
一个有10个整型数的数组:int a[10];
一个有10个指针的数组,该指针指向一个整型数 :  int*a[10]
 一个指向函数的指针,  该函数有一个整型参数,并返回一个整型数   :            int (*p)(int a)
一个有10个指针的数组, 该指针指向一个函数,该函数有一个整型参数,并返回一个整型数 ,       int (*a[10])(int a)


3. 
int  b;
int *a=&b;       表示 定义一个指向整型变量的指针a,同时把b的地址给a;
相当于:  
  int  b;
 int  *a;
  a=&b; 


4.指针和数组
int a[5];
int *ptr;
ptr = a;----数组a的首地址给ptr;
也可以写成:
ptr=&a[0];-----第一个元素的地址给ptr;
 
#include <stdio.h>
 
int main()
{
    int a[10]={0,1,2,3,4,5};
    int  *ptr;
 
    ptr = a;
    printf("a = %d\n",ptr[3]); -----a[3], *(ptr+3)都是可以的;
 
    return 0;
}
~                                                                                                
~      
 
 
 
5.指针和字符串
char *ptr;
ptr="hello world";
或者:
char *ptr = "hello world";
 
后面碰到:char * ----,就要想到字符串;“”
#include <stdio.h>
 
int main()
{
    char *str="hello world!";
 
    printf("str=%s\n",*str);
 
    return 0;
}
~  
错误:会出现段错误,因为%s是字符串,不是字符,而*str表示h;


6. NULL和指针
在c中:#define  NULL  0
但是判断指针变量为不为0的时候,用if(ptr != NULL); 不允许用0来做比较;
可以用char *ptr = NULL;  来初始化ptr,但是ptr还是不能使用;必须赋地址才行;


7.int a[10];
int *p=a;
p+i, a+i都表示a[i]的元素地址;
*(p+i), *(a+i)都是表示a[i];
**********************************************
p[i] 和*(p+i) 等价
**********************************************  
a[5]----*(a+5), *(p+5),p[5] 等价的;
&a[5]---p+5, a+5,等价都是a[5]的地址;
 
下标法:a[i],p[i];
指针法 :*(a+i), *(p+i)


8.指针数组,数组指针
char *str = "hello world"-----表示的str中放置的是hello  world的首地址;
如果几个字符串放在一个数组中,如:
char  *str[4] = {"hello", "world", "yes","what"};  ----指针数组,表示:
      str[0]中放置的是“hello" 的首地址;
      str[1]中放置的是"world"的首地址;
      str[2]中放置的是 “yes”的首地址;
      str[3]中放置的是"what"的首地址;
 
 
数组指针:
int a[4][4]={{0,1,2,3},
                  {4,5,6,7},
                  {8,9,10,11},
                   {12,13,14,15}};
 
int  (*p)[4]------数组指针;
p=a;  -----p放置的是a的第0行首地址;
p------0,1,2,3
p+1-----4,5,6,7
p+2-----8,9,10,11
p+3-----12,13,14,15
 
9.  int **p
 int *p ----p放地址----〉3
 int  **p----*p----p-----3
 
 
#include <stdio.h>
 
int main()
{
   int a[5]={1,3,5,7,9};
   int *num[5];
   int **p;
 
   for(i=0; i<5; i++)
       num[i]= &a[i];
   p=num;
   for(i=0; i<5; i++)
   {
        printf("%d ", **p);
        p++;
   }
    printf("\n");
 
   return 0;
}
 
 
10.  列指针变量
#include <stdio.h>
 
int main()
{
   int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
   int *p;
    
                               a[0]   --------------0行0列的地址
   for(p=a[0]; p<a[0]+12; p++)
   {
         printf("%3d ", *p);
   }
          
   return 0;
}
 
 
11. 行指针变量
#include <stdio.h>
 
int main()
{
     int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
     int (*p)[4];
     int i,j;
     
     p=a;
    for(j=0; j<4; j++)
          printf("%3d", *(p+j));
          
    return 0;
}
 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值