在C中使用双指针(char **)与(char *)的优势?

时间:2018-10-15 16:26:52

标签: c pointers

我正在尝试使用以下原型实现功能。

String[] fontNames = {"Monospaced","ProcessingSansPro-Regular"};
int NUM_FONTS = fontNames.length;
PFont[] fonts = new PFont[NUM_FONTS];
PFont font;

int FONT_SIZE = 30;
String message = "Hello World";

ArrayList<PShape> glyphShapes;

void setup(){
  size(345,345);
  textAlign(CENTER);
  fill(0);

  // load fonts
  for(int i = 0 ; i < NUM_FONTS; i++){
    fonts[i] = createFont(fontNames[i],FONT_SIZE);
  }

  // set first font
  setFont(0);

}

void draw(){
  background(255);
  text(message,width * 0.5,height * 0.5);

  drawGlyphShapes();

}

void keyPressed(){
  if(key == '1'){
    setFont(0);
  }
  if(key == '2'){
    setFont(1);
  }
}

void setFont(int fontIndex){
  // check font data is accessible
  if(fonts != null){

    if(fontIndex >= 0 && fontIndex < fonts.length){

      // update global reference to currently set font
      font = fonts[fontIndex];
      // tell Processing to use this font
      textFont(font,FONT_SIZE);
      // update glyph shapes
      glyphShapes = getGlyphShapes(font,message);
    }else{
      println("error: invalid array index",fontIndex,"valid range is",0,fonts.length-1);
    }

  }else{
    println("error: null fonts array");
  } 
}

ArrayList<PShape> getGlyphShapes(PFont font,String message){

  ArrayList<PShape> result = new ArrayList<PShape>();

  // access font glyph images
  for(int i = 0 ; i < message.length(); i++){

    // get the each character
    char currentChar = message.charAt(i);
    // get the glyph shape
    PShape glyphShape = font.getShape(currentChar);
    // if there is a glyph (space or other special character might not be encoded in the font file)
    if(glyphShape != null){
      // add the shape to the list
      result.add(glyphShape);
    }

  }

  return result;
}

void drawGlyphShapes(){
  float maxGlyphHeight = 30;
  for(int i = 0; i < glyphShapes.size(); i++){
    PShape glyphShape = glyphShapes.get(i);
    glyphShape.disableStyle();
    noFill();
    beginShape();
    for(int j = 0 ; j < glyphShape.getVertexCount(); j++){
      PVector vertex = glyphShape.getVertex(j);
      vertex(10 + vertex.x,vertex.y + 30 + glyphShape.getHeight() + (maxGlyphHeight * i));
    }
    endShape(CLOSE);
  }
}

第一个参数是将用于读取的 文件描述符

第二个参数是指向要使用的字符的指针的 地址 保存从文件描述符读取的行。

关于传递引用和值的区别,我唯一了解的是引用允许您修改内容值。 但是对于给定的原型,我们具有第一个字符的地址,因此我不完全了解对双指针的需要。

[已编辑]:我们在'** line'中存储一行字符。

我的问题是:

为什么使用** line而不仅仅是* line?为什么不使用?

1 个答案:

答案 0 :(得分:2)

int get_next_line(int fd, char **line);

这是一个可用的功能。大概会分配一个临时大小足够的字符数组,在其中读取一行,必要时重新分配并读取其余部分,然后通过将分配的字符串分配给已取消引用的第二个参数(*line = allocated_string;)来传递回该字符串。


int get_next_line(int fd, char *line);

这是专利废话。无法编写与上一个远程可用的get_next_line。它无法确定传递给它的字符数组的大小,也无法重新分配此数组。指定此功能的行为有些明智的唯一方法是要求参数必须是在其他地方指定的某个预定大小的数组。这仅在某些非常狭窄的环境中有用。

请注意,这并不是立即显而易见的发现。 C语言曾经有gets到2011年为止。程序员过去常常很粗心。


int get_next_line(int fd, char *line, size_t size);

这可能是一个有用的功能。它可以像标准read函数一样工作,除了它不会读取第一个行尾字符之外。 (或者像fgets用于Posix fike句柄。)当然,用户需要处理输入线长于其数组的情况。如果扫描的字符大概get_next_line将返回数字。


注意const int在函数原型中没有用。在这种情况下,所有标准函数都指定int