指针

一。 指针(数组)

1.

char *p = "abc";
char *q = NULL;
q = p;    ----------- 就是p、q值相等,都是  "abc"的首地址 
 

指针的指针:当一个指针P想访问一个值, 但是它所指的还是一个指针变量, 而这个指针变量指向的才是那个要访问的值, 这个时候P就必须定义为指针的指针  

 2. char *p[5];然后我想访问其中的第i个指针指向的字符串中的第i个字符, 
   例如: char *p[2] = {
                "asdf",
                "1234"
             }

int  j = 0;
int  i = 0;

for (j; j++; j <2)
{
    for (i; i++; i <5)
    {
        printf("%c/n", p[j][i]);
    }
}
也可以这样访问: printf("%c/n", *(*(p+j) + i));

二、 二维数组

    int a[3][4];
a的类型可能是一个指向数组的指针(*p)[4];
通过例子证明:
int a[3][4] = {....}
int *p;
p=a;//illegal indirection

for(i=0;i<2;i++)
  for(j=0;j<3;j++)
   printf("%d  ",*(*(p+i)+j));
编译不过的..illegal indirection  p的类型是int*,而a是int(*)[3]
'int *' differs in levels of indirection from 'int (*)[3]'

若 int **p;
p = a;
warning:'int ** ' differs in levels of indirection from 'int (*)[3]
so,int**和二维数组的数组名并不是那么一回事.
即使 p=(int**)a;运行结果也让人很莫名其妙

现若 int (*p)[3];
p= a;
oK啦!

2. 指针与字符串以及**

int** 用来指 int*:例 a[0]~a[5]中存的是整型地址,要取地址中的内容就**.
int  **p1;
int  i;
int  *p2;
p2 = i;  
p1 = &p2;
所以。通过p1访问i时 就要**p1了。
我们最好只用*和*[]就好了.
字符串和指针:
char s1[] = {'a','b','c','d'};//长度是4
char s2[]={"abcd"};//长度4
char s3[]="abcd";//长度5

char *p=s1;
puts(p);
在tc编译器里:因为地址连续,输出abcdabcd
但在vc里输出abcd之后还有乱码(两种情况都是在找/0)
s1 = "abcd";//这abcd是字符串常量,很多教材说不可以修改其内容
//但在tc编译器里可以修改其内容,在vc里运行时崩溃

char* p2[4];
p2[0]="this is"
所以,p2[0]+1;//p2[0]是char*,+1就是加一个基类型的长度.
printf("%c",  *(p2[0]+1)) ;是h
要指向 char * p2[4]; 只要在基类型上加*
char **p_c;
p_c = p2;
puts(p_c);//结果又莫名其妙了
puts(*p_c);//OK啦

 

三。 二位数组与指针数组(吴敏老师)

 

char * p[5] = {"abc", "2abc", "3abc", "4abc", "5abc"};

p---->p[0]~~p[5]数组元素

而P[0] 指向存放的字符串的首地址:P[0]是“abc”的首地址,因为P是数组的首地址,而数组第一个元素是P[0],就是它的地址,

 

int a[3][2] = {2, 3, 6, 4, 6, 3};

 

 

 

对话

 

char a[] = {"abcd"};
char b[] = "abcd";    strlen()是相等的,数组长度一样  

 

 


 char *a[] = {"0abc", "1abc", "2abc"};
  char **p  ;

 p = a;

 
a  是  &a[0]
a[0]是“0abc”的首地址,因为a是数组的首地址,而数组第一个元素是a[0],就是他的地址,
a[0]是指针数组中的元素,指针数组就是数组元素是指针,就是a[0]是字符型指针,他指向字符串“0abc”
而你的指针p可以指向a[0],因为a[0]是指针,而p是指针的指针

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值