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

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

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");
  }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值