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

原创 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数组与...
  • wuseyukui
  • wuseyukui
  • 2015年12月16日 22:39
  • 1564

关于C语言中的数组指针、指针数组以及二级指针

概念解释数组指针:首先它是一个指针,它指向一个数组,即指向数组的指针;在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道。数组指针指向的是数组中的一个具体元素,而不是整个数组,所以...
  • u014265347
  • u014265347
  • 2017年02月05日 19:14
  • 3020

字符串指针与char型指针数组

一、字符串指针 字符串是一种特殊的char型数组,指向char类型数组的指针,就是字符串指针。与普通指针一样,字符串指针在使用前也必须定义。字符串与char数组的区别在于长度,字符会自动在尾部加上一...
  • generalhking
  • generalhking
  • 2012年08月19日 22:19
  • 8566

C经典 Char型指针数组与字符数组的区别

1.char 类型的指针数组:每个元素都指向一个字符串,指向可以改变char *name[3] = { "abc", "def", "gbk" }; for(int i = 0...
  • lovoo
  • lovoo
  • 2016年05月03日 20:49
  • 943

字符数组与字符指针

1.字符指针可以指向一个字符串。我们可以用字符串常量对字符指针进行初始化。例如,有说明语句:char *str = "This is a string."; 是对字符指针进行初始化。此时,字符指针指向...
  • qiumm
  • qiumm
  • 2010年06月09日 00:09
  • 33924

数组指针,字符串指针的几种定义方法

一:数组指针的定义方法int a[10] = {1,2,3,4,5,6,7,8,9,0}; int * p; p = &a[0]; // 等价于p = a;2.int a[10] = {1,2,3...
  • TAaron666
  • TAaron666
  • 2017年07月25日 10:15
  • 380

用指针数组保存字符串并将字符元素打印输出

指针数组
  • weichanjuan3
  • weichanjuan3
  • 2015年07月22日 21:10
  • 2198

字符指针与字符数组真正的区别

本文从字符串指针与字符串数组的例子开始,讲述了C语言中使用内存的不同方式,以及他们与Linux内存布局的关系。并使用Linux下的工具对想法进行了验证。...
  • on_1y
  • on_1y
  • 2013年10月25日 20:46
  • 13400

c语言 如何用指针来处理字符串?

一字符指针 1字符指针输出字符串 2字符指针处理字符串 3字符数组与字符指针处理字符串有何不同 二指针数组读者,你好! 如果你精通C,希望能得到你的斧正;如果你是初学者,希望能对你有所帮助。 ...
  • C2681595858
  • C2681595858
  • 2016年12月09日 20:48
  • 8431

字符串指针与字符数组的区别

用字符数组和字符指针变量都可实现字符串的存储和运算。但是两者是有区别的。在使用时应注意以下几个问题: 1.     字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首...
  • okliujieko
  • okliujieko
  • 2011年09月26日 10:41
  • 40237
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:指针、数组、二级指针、指针数组与字符串
举报原因:
原因补充:

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