一。 指针(数组)
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是指针的指针