指针、数组、二级指针、指针数组与字符串

原创 2006年05月17日 13:23:00

先来一组指针和数组的比较

void TestForVectorAndPointer  ()
{
 char a[] = "abcd";                     //栈中存放数组a[4],数组存放'a''b''c''d''/0'
 printf("%x %s/n", a,        a);             
// 0x0012FF24 abcd  //对数组名操作
 printf("%x %s/n", &a,       &a);        
// 0x0012FF24 abcd  //取数组首地址
 printf("%x %s/n", a + 1,    a + 1);     // 0x0012FF25 //取数组次地址
 printf("%x %c/n", *(a + 1), *(a + 1));
// 62 b             //取第2个元素
 printf("%x %c/n", a[1],     a[1]);        
// 62 b             //取第2个元素
 printf("%x %s/n", &a[1],    &a[1]);   // 0x0012FF25 bcd   //取数组次地址

// 不支持*(a++)的操作,数组名不能赋值

 char* p = "abcd";                         //栈中存放指针p,指向常量区的字符串"abcd"
 printf("%x %s/n", p,        p);            
// 0x0047E56C abcd  //取字符串的首字符地址
 printf("%x %s/n", &p,       &p);        
 // 0x0012FF20 乱码1 //取指针地址
 printf("%x %s/n", p + 1,    p + 1);     
// 0x0047E56D bcd   //取字符串的次字符地址
 printf("%x %c/n", *(p + 1), *(p + 1));// 62 b             //取字符串的首字符
 printf("%x %c/n", p[1],     p[1]);        // 62 b             //取字符串的次字符
 printf("%x %s/n", &p[1],    &p[1]);   // 0x0047E56D bcd   //取字符串的次字符地址
 printf("%x %c/n", *(++p),   *(++p));  // 63 b    //右结合b、63  // 慎用!p指向地址发生变化

 char* pp = a;                           //栈中存放指针pp,指向常量区的数组a[4]
 printf("%x %s/n", pp,        pp);              // 0x0012FF24 abcd //取数组首地址
 printf("%x %s/n", &pp,       &pp);         // 0x0012FF1C 乱码2//取指针地址
 printf("%x %s/n", pp + 1,    pp + 1);    
// 0x0012FF25 bcd  //取数组次地址
 printf("%x %c/n", *(pp + 1), *(pp + 1)); // 62 b            //取数组第2个元素
 printf("%x %c/n", pp[1],     pp[1]);        // 62 b            //取数组第2个元素
 printf("%x %s/n", &pp[1],    &pp[1]);   // 0x0012FF25 bcd  //取数组次地址
 printf("%x %c/n", *(++pp),   *(++pp));
// 63 b      //右结合b、63  // 慎用!p指向地址发生变化
}

再来一组指针和数组的比较

void TestForVector2DAndPointer(void)      
{      
    char* test[] = {"11", "222", "3333", "44444"};  // 栈中存放数组test[4],数组存放4个指针,每个指针均指向一个字符串
 printf("%x %s/n", test, test);              // 0x0012FF1C 乱码1 对数组名操作
 printf("%x %s/n", &test, &test);            // 0x0012FF1C 乱码1 数组地址
 printf("%x %s/n", &(test[0]), &(test[0]));  // 0x0012FF1C 乱码1 数组首元素的地址
 printf("%x %s/n", test + 1, test + 1);      // 0x0012FF20 乱码2 地址加法运算 + sizeof (int)
 printf("%x %s/n", &test + 1, &test + 1);    // 0x0012FF2C 乱码3 地址加法运算 + sizeof (test)
 printf("%x %s/n", *(test + 1), *(test + 1)); // 0x0047C038 222 取数组次元素
 printf("%x %s/n", test[1], test[1]);        // 0x0047C038 222 取数组次元素
 printf("%x %s/n", *(&test + 1), *(&test + 1)); // 0x0012FF2C 乱码3 地址加法运算

 char** pTest = test;           // 栈中存放二级指针pTest,指向数组test[4]
 printf("%x %s/n", pTest, pTest);              // 0x0012FF1C 乱码1 对数组名操作
 printf("%x %s/n", &pTest, &pTest);            // 0x0012FF18 乱码4 指针地址
 printf("%x %s/n", &(pTest[0]), &(pTest[0]));  // 0x0012FF1C 乱码1  数组首元素的地址
printf("%x %s/n", pTest + 1, pTest + 1);      // 0x0012FF20 乱码2 地址加法运算 + sizeof (int)
 printf("%x %s/n", &pTest + 1, &pTest + 1);    // 0x0012FF1C 乱码1 数组首元素的地址
 printf("%x %s/n", *(pTest + 1), *(pTest + 1)); // 0x0047C038 222 取数组次元素
 printf("%x %s/n", pTest[1], pTest[1]);        // 0x0047C038 222 取数组次元素
 printf("%x %s/n", *(&pTest + 1), *(&pTest + 1)); //0x0012FF2C 11 地址加法运算
}

最后转来一个比较简洁的示例

http://www.cstudyhome.com/wenzhang06/ReadNews.asp?NewsID=6043

#include "stdio.h"
#include "stdlib.h"
/*test a funtion of 2 demesion char*/
main()
{
 char s[3][3]={ {'1','1','1'},{'2','2','2'},{'3','3','3'} },**u;
 int i,j;
 u=s;
 system("cls");
 for(i=0;i<3;i++)
  {
   for(j=0;j<3;j++)
    printf(" %c ", *(*(u+i)+j) ); printf("/n");
  }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

C——提高(2)字符串一级指针、二级指针内存模型

字符串一级指针C语言里没有实质的字符串类型,通过字符数组来模拟。 C语言的字符串是以0结尾的字符串。 C语言字符串的内存分配 可以分配在堆上、栈上、全局区上。1、字符串一级指针内存模型buf数组与...

二级指针与指针数组的关系

#include void test(char *argv[]); int main(void) { char *argv[3]={{"abcdefg"},{"1234567"},...

C语言通过两个指针挖取字符串,并存入到二级指针中

#include "stdio.h" #include "stdlib.h" #include "string.h" /* 有一个字符串符合以下特征(”abcdef,acccd,eeee,aaaa,e...

二级指针操作指针数组

分享到:  收藏 +2 踩顶0 使用指针数组操作多个字符串,还可以通过二级指针变量的方式进行这种操作,首先定义一个字符串指针数组s,用来指向多个字符串常量,再定义一个二级指针变...

关于一级指针和二级指针的部分理解(I)

时间:2/15/2013 在复习一个算法:老鼠走迷宫I   的时候,用到了一个打印迷宫的函数,因为迷宫用一个二维数组来表示,但可能以后在应用中,并不知道二维数组的大小,所以想使用指针的方式来遍历数组...

二级指针变量与数组

在C语言中,数组名就是一个指针常量,保存数组的首地址。因为数组名是一个常量指针常量,不能修改其指向的值,因此可以定义一个指针变量指向数组。这样使用数组名加下标可访问数组中的元素,使用指针名加下标也可访...
  • yyme411
  • yyme411
  • 2013年07月01日 14:40
  • 3407

多个字符串的输出(指针数组、二级指针)

#include #include #include #define NUM 20 #define MAXSIZE 15 //输入一些有关颜色的单词,每行一个,以#作为输入结束的标志。按输入的...

二维数组与二级指针

今日在论坛上看到有人问到指针的问题,我想通过这样的例子来阐述几个常见的错误,并加深对二  级指针和二维数组之间关系的理解.  我们知道char array[]=”abcdef”; array是数组的首...
  • njsssch
  • njsssch
  • 2011年05月21日 13:36
  • 339

二维数组和二级指针

前两天写个程序,传参数的时候想传个二维数组进去,结果悲剧了,函数写成Fun (int **p){},原来没有这么写过, 以为这么写也是对的,结果错了,查了些资料,做个总结。 Fun (in...

C语言的二维数组和二级指针的理解

1.数组本质     int a[5] 一维数组名代表数组首元素的地址     int a[5] ===> a的类型为int*     二维数组名同样代表数组首元素的地址     int b[...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:指针、数组、二级指针、指针数组与字符串
举报原因:
原因补充:

(最多只允许输入30个字)