C 指针
#include<stdio.h>
int main()
{
//二维数组,所有元素存放在栈区
char s[][10]={"KAIKEBA","XINZHIKE","LINUX","AIOT0707"};
//一维指针数组
char *ss[]={s+1,s+3,s+2,s};
//二重指针,是指指向指针的指针
char **sss=ss;
printf("%s\n",*++sss);
printf("%c\n",--*++*sss++);
printf("%s\n",sss[-2]+1);
printf("%c\n",*sss[-1]+3);
printf("%s\n",++*(sss--));
return 0;
}
第一个printf:
#include<stdio.h>
int main()
{
char s[][10] = {"KAIKEBA" , "XINZHIKE" , "LINUX" , "AIOT0707"};
char *ss[] = {s + 1 , s + 3 , s + 2 , s};
char **sss = ss;
//首先先打印*sss
printf("+++++++ %s\n",*sss);//ss[0]->s+1->s[1] = XINZHIKE
//*++sss相当于*(++sss) 指针自增1
printf("%s\n",*++sss); //ss[1]->s+3->s[3] = AIOT0707
return 0;
}
第二个printf:
这个涉及到优先级问题:前置 ++ 与* 优先级相同,后置 ++ 优先级高于 *
#include<stdio.h>
int main()
{
char s[][10] = {"KAIKEBA" , "XINZHIKE" , "LINUX" , "AIOT0707"};
char *ss[] = {s + 1 , s + 3 , s + 2 , s};
char **sss = ss;
//首先先打印*sss
printf("%s\n",sss);//*sss->ss[0]->s+1->s[1] = XINZHIKE
//*++sss相当于*(++sss) 指针自增1
printf("%s\n",*++sss); //*++sss->ss[1]->s+3->s[3] = AIOT0707
//-----------------------------------------------------------------
//--*++*sss++ 相当于 --(*(++(*(sss++))))
/*
*(sss++)-> ss[1] = AIOT0707 且其指向的是该字符串的首元素地址
*++(*(sss++)) 也就相当于首元素地址前置++ ,指向第二个元素 ‘I’
--(*(++(*(sss++)))) 也就相当于 --I ,根据ascii码,可得结果为 H
*/
printf("%c\n",--*++*sss++); //结果为H
return 0;
}
第三个printf:
#include<stdio.h>
int main()
{
char s[][10] = {"KAIKEBA" , "XINZHIKE" , "LINUX" , "AIOT0707"};
char *ss[] = {s + 1 , s + 3 , s + 2 , s};
char **sss = ss;
//首先先打印*sss
printf("%s\n",sss);//*sss->ss[0]->s+1->s[1] = XINZHIKE
//*++sss相当于*(++sss) 指针自增1
printf("%s\n",*++sss); //*++sss->ss[1]->s+3->s[3] = AIOT0707
//-----------------------------------------------------------------
//--*++*sss++ 相当于 --(*(++(*(sss++))))
/*
*(sss++)-> ss[1] = AIOT0707 且其指向的是该字符串的首元素地址
*++(*(sss++)) 也就相当于首元素地址前置++ ,指向第二个元素 ‘I’
--(*(++(*(sss++)))) 也就相当于 --I ,根据ascii码,可得结果为 H
*/
printf("%c\n",--*++*sss++); //结果为H
//------------------------------------------------------------------
/*
sss[-2]+1 相当于 *(sss-2)+1
此时,*sss经过上面的运算已经指向 ss+2 ,所以(sss-2)-> ss -> s+1 = XINZHIKE,也就是字符串的首元素地址。
则*(sss-2)+1指向字符串第二个元素,所以打印结果为从第二个元素开始的字符串“INZHIKE”
*/
printf("%s\n",sss[-2]+1);
return 0;
}
后面的结果同理可得,
最终运行结果为: